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

标签 swift uiview autolayout nslayoutconstraint

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

在我看来,我通过固定左侧和顶部将一个堆栈 View x float 到左侧,并通过固定右侧和顶部将堆栈 View float 到右侧。有点像这样(= 符号表示屏幕边框)

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

我没有对宽度和高度设置任何限制,因为一切都应该是推断出来的。 xib Constraints

我的 View 对应的类很简单:

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
    }

}

我通过将其固定到左侧、右侧、顶部和底部来在 Storyboard中使用此 View 。 UIView in storyboard .

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

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

最佳答案

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

此外,在将 View 添加到 View 层次结构后,您需要在代码中添加一些约束,将其顶部、底部、左侧和右侧边缘固定到其父 View 的相应边缘。毕竟,您将 XIB 的内容作为 subview 添加到您的自定义 View MyView 即这两个 View 不相同,您需要告诉系统它应该如何定位 subview (您的约束添加到你的 Storyboard只涉及到你的 MyView 实例,而不是它的 subview )。添加到您的代码中应该可以解决问题:

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 中关于 translatesAutoresizingMaskIntoConstraints 属性的更详细解释.
  • Interface Builder 中“模拟指标”部分中的所有设置仅适用于 Interface Builder 本身。当您在模拟器或真实设备上运行应用时,它们不会对您的应用产生任何影响。

关于swift - 即使设置了约束,UIView 也会被裁掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497223/

相关文章:

ios - Firebase 观察大型数据库缓慢

ios - 用户通知是否收到响应方法不允许我将更新的变量传递给 UIApplication.shared.open() ?

ios - iOS 7 上的 UIVibrancyEffect

ios - 为所有设备屏幕设置UIImage覆盖屏幕,xib文件

ios - Xcode 自动布局 : Label centered between two neighbors

ios - 连接到 tabbarcontroller 时无法在 swift 4.2 中的导航栏上显示栏按钮项目?

swift - 不发送任何短信

ios - 如何与在父 UIView 边界之外绘制的子 UIView 进行交互?

ios - iPhone - 某个区域的动画

ios - Xcode-9 beta 中的自动布局被破坏