即使设置了约束,UIView也会被裁掉

时间:2015-12-28 16:37:44

标签: swift uiview autolayout nslayoutconstraint

我在xib文件中创建了一个自定义视图,我在其中将所有模拟指标设置为“推断”

在我的视图中,我通过固定左侧和顶侧将左侧的一个堆栈视图x向左浮动,并通过固定右侧和顶部将堆栈视图向右移动。不知何故这样(=符号表示屏幕边框)

==========
=x      y=
=        =
=        =
=        =
=        = 
==========

我没有为宽度和高度设置任何约束,因为应该推断出所有内容。 xib Constraints

我视图的相应类很简单:

class MyView: UIView {

    var view:UIView!
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        view = UIView.loadFromNibNamed("MyView")
        addSubview(view)
    }
}
extension UIView {

    class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {
        return UINib(
            nibName: nibNamed,
            bundle: bundle
            ).instantiateWithOwner(nil, options: nil)[0] as? UIView
    }

}

我在故事板中使用此视图,将其固定在左侧,右侧,顶部和底部。 UIView in storyboard

问题是视图是从nib加载的,但宽度在某种程度上不是动态的。我希望视图根据父级的大小自行调整大小。但是,即使我已经设置了约束,右侧堆栈视图的大约1/3也会被裁剪掉并且在屏幕上不可见。

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

  1. 我们需要确定问题是什么,所以让我们首先确认堆栈视图正在设置它们的框架。在视图控制器中,堆栈视图是我们可以覆盖following methods并检查堆栈视图的帧。

      viewWillLayoyutSubviews()
      viewDidLayoutSubviews()
    
  2. 确认框架已设置,我们现在可以查看故事板中设置的约束。您提供的信息如何将堆栈视图布局放在一起,是不是在另一个视图之上?它们应该是并排的吗?

    您需要检查约束是否对您想要的布局有效。

  3. 3.确认您的视图的大小类已正确配置。 Apple在这里有一个名为“Size Classes Design Help”的文档。我相信这是你的问题。您的自定义类被设置为具有Any / Any的大小类,并且自定义视图的超级视图具有不同的大小类集,例如Compact / Regular。因此,自定义视图根据大小类调整其大小,因为对于任何大小类组合,它都设置为相同。尝试为自定义类配置不同大小的类组合,以查看是否存在任何差异 - 例如Compact / Regular。

答案 1 :(得分:1)

如果您希望它具有动态帧大小,则需要为从XIB加载的任何视图将translatesAutoresizingMaskIntoConstraints属性设置为false。否则,系统将自动创建布局约束,如固定宽度和固定高度,以防止视图调整大小。

此外,在将视图添加到视图层次结构中之后,需要在代码中添加一些约束,该视图层次结构将其顶部,底部,左侧和右侧边缘固定到其超级视图的相应边缘。毕竟,您将XIB的内容作为子视图添加到自定义视图MyView,即两个视图不同,您需要告诉系统它应如何定位子视图(您在故事板中添加的约束仅与您的MyView实例有关,而与其子视图无关。这些对代码的补充应该可以解决问题:

class MyView: UIView {

    var view:UIView!
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        view = UIView.loadFromNibNamed("MyView")
        view.translatesAutoresizingMaskIntoConstraints = false
        addSubview(view)

        // Pin view to all four edges of its superview
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: [], metrics: nil, views: ["view": view]))
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: [], metrics: nil, views: ["view": view]))

    }
}

附注:

  • 阅读official documentation。{/ li>中translatesAutoresizingMaskIntoConstraints属性的更详细说明
  • "模拟指标中的所有设置" Interface Builder中的部分仅适用于Interface Builder本身。当您在模拟器或真实设备上运行时,它们不会对您的应用产生任何影响。