AutoLayout 不适用于嵌入式 Xib 文件

Posted

技术标签:

【中文标题】AutoLayout 不适用于嵌入式 Xib 文件【英文标题】:AutoLayout not working with embedded Xib file 【发布时间】:2016-06-01 19:02:15 【问题描述】:

我有一个带有标签的笔尖,它使用自动布局垂直和水平居中。我声明了UIView 的子类并在其中加载了 nib 文件。

然后我将UIView 添加到我的主视图控制器并为其分配新的子类。问题是 nib 文件的标签没有以视图为中心,它不遵循 AutoLayout 约束。

Download test project.为什么会这样?

【问题讨论】:

标签看起来像是以蓝色视图为中心。你还需要什么 ?你想让它以 self.view 为中心吗? @TejaNandamuri 问题是蓝色视图的宽度恰好是超级视图大小的一半,因此标签没有居中并且似乎向右偏移。 加载xib后,必须手动修改其frame,使其等于super view frame一半的蓝色view frame! 当您以编程方式加载 xib 时,它采用故事板中设计的 xib 的原始帧大小。在加载 xib 后,为您的自定义视图创建一个插座属性并更改其框架! @TejaNandamuri 谢谢。我正在尝试找到一种方法来调用自定义视图以更新其框架。也许layoutIfNeeded() 【参考方案1】:

您应该如何编写自定义类:

import UIKit

class CustomView: UIView 

    @IBOutlet var view: UIView!

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)!
        view = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as! UIView
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        view.translatesAutoresizingMaskIntoConstraints = true
        view.frame = bounds
        self.addSubview(self.view)
    

这是一个工作示例:

Testxibautolayout2.zip

【讨论】:

【参考方案2】:

当您以编程方式加载 xib 时,它采用在情节提要中设计的 xib 的原始帧大小为 600x600。在加载 xib 后,为您的自定义视图创建一个插座属性并更改其框架! ——

在你的情况下,你必须这样做:

import UIKit

class CustomView: UIView 

    @IBOutlet var testView: UIView!

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)!
        NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)
        self.addSubview(self.testView)
        self.testView.frame=CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)
        //or
        self.testView.frame=self.bounds
    

【讨论】:

以上是关于AutoLayout 不适用于嵌入式 Xib 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 xib 文件上设置的约束不适用于 ipad ios

自动调整大小不适用于 xib 文件中的视图内容

AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?

iOS - XIB之AutoLayout添加约束

Autolayout 不适用于带有 Storyboard 的 NSSplitView 和 NSPageController。这是苹果虫吗?

XIB——AutoLayout添加约束