Xcode自定义UIView没有正确显示

时间:2017-08-29 04:04:14

标签: xcode uiview interface-builder uistackview

我创建了一个自定义UIView A,它嵌入到另一个自定义UIView B中,因为我想重用视图。

(不能发布超过2张图片,如此省略)

我使用的swift代码如下:

override init(frame: CGRect)
{
    super.init(frame: frame)
    setupView()
}

required init?(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder)
    setupView()
}

private func setupView()
{
    let view = viewFromNibForClass()
    view.autoresizingMask = [
        .flexibleWidth,
        .flexibleHeight
    ]
    view.frame = bounds
    addSubview(view)
}

private func viewFromNibForClass() -> UIView
{
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
    return view
}

当将多个UIView A(在堆栈中)放入UIView B时,视图将随机跳转到超视图的左上角,有时会超出视图帧。我必须暂时将调整大小的掩码更改为:

view.autoresizingMask = [
        .flexibleWidth,
        .flexibleHeight,
        .flexibleTopMargin,
        .flexibleBottomMargin,
        .flexibleLeftMargin,
        .flexibleRightMargin
    ]

然后在进行调整后将其更改回来。但是,我仍然无法对superview.leading应用任何简单的约束,如身高或距离,而不会遇到多次冲突

Custom UIView B containing several UIView A

要解决所有冲突,我必须删除所有约束并继续。然后,将UIView B放入我的主故事板中的视图控制器中,再次将导致视图跳转到某个奇怪的位置。我认为这归因于第一个查询中概述的UIView A的异常行为。

Generic view controller containing UIView B

感谢您的帮助或指示!

1 个答案:

答案 0 :(得分:0)

在仔细检查每个文件(没有删除并从头开始)之后,我意识到XIB文件在Identity Inspector中有一个自定义类引用自身。这可能导致它以递归方式调用init(coder aDecoder: NSCoder),因此其位置失控。之前没有检测到这一点,因为我没有使用Autolayout使用自定义视图,一切都很好。是的,文件的XIB所有者设置正确。删除了错误,一切都很好。