使用loadNibNamed和Size Classes获取约束

Tom*_*min 5 xib ios autolayout ios8 size-classes

我正在使用Autolayout和Size Classes从xib加载视图.在该视图中,有一个子视图,viewWithSizeClasses其高度受约束,取决于大小等级.

我想要做的是立即加载约束loadNibNamed,以便根据当前的Size Class获得适当的高度.

我尝试了各种组合layoutSubviews(),updateConstraints()但无论我做什么,我总是得到默认的Any,Any height.

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let xibView = NSBundle.mainBundle().loadNibNamed("View", owner: self, options: nil).first as View

    self.view.addSubview(xibView)
    height = xibView.viewWithSizeClasses.frame.size.height // <- Any, Any height
}
Run Code Online (Sandbox Code Playgroud)

我正在iOS8或更新版本上部署.

rhm*_*c25 0

我在尝试对 iPhone 和 iPad 使用具有不同约束的相同 xib 时遇到了同样的麻烦。我的解决方案是为同一 xib 中的每个尺寸类别创建一个视图。然后在加载 xib 时,通过索引访问正确的视图。就我而言,我的 Any-Any 尺寸类别位于索引 0 处,Regular-Regular 位于索引 1 处。

NSArray *views = [NSBundle.mainBundle loadNibNamed:NSStringFromClass(self.class) owner:self options:nil];
UIView *view = views[IS_IPAD];
Run Code Online (Sandbox Code Playgroud)

我相信你可以将其翻译为 Swift。我还定义了一个全局宏

#define IS_IPAD (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
Run Code Online (Sandbox Code Playgroud)