我有一个自定义的UIView子类,它抓取layoutSubviews中的所有子视图,并根据一些自定义设置改变它们的布局/大小。
如果我以编程方式创建此视图,则一切正常但是如果我将此UIView子类添加到故事板并在故事板中添加一些子视图,则布局更改似乎不会持续存在。
我可以使用断点看到以下逻辑流程。
VC&自定义视图已初始化
调用VC viewDidLayoutSubviews。 (我在这里什么都不做,只是观察它是用断点调用的)
调用自定义UIView,layoutSubviews。
override func layoutSubviews() {
for subView in self.subviews {
var subview = subView as! UIView
var frame = subview.frame
//some arbritary frame adjustments.
frame.origin.x = 10; frame.origin.y = 50;
subview.frame = frame
subview.setNeedsLayout() //tried with and without this line with no difference.
}
}
我可以看到正在调整帧,因为我在调整它们之前打印所有子视图,然后再通过调试器再次调整。
po self.subviews
再次调用VC viewDidLayoutSubviews。但是,当我在这里打印子视图时,我可以看到他们再次回到原始帧。
po customView.subviews
显示视图且未调整帧数。
如果我再次调用layoutSubviews,子视图帧最终会调整,但只有在视图出现之后才会进行调整。
override func viewDidLayoutSubviews() {
customView?.layoutSubviews();
}
此流程如下:
VC&视图已初始化
VC viewDidLayoutSubviews名为
layoutSubviews连续两次调用
显示视图并且子视图尚未重新调整,即使它们在通过调试器打印时位于layoutSubviews中。
VC - 再次调用viewDidLayoutSubviews
再次调用layoutSubviews。
您可以看到子视图调整但是为时已晚,因为用户可以看到子视图“跳转”到位。
关于我在这里缺少什么的想法?子视图帧肯定是正确设置的,但它们只是在视图出现之前被还原。
我恰好正在使用swift,但目标C中的响应非常受欢迎。
答案 0 :(得分:2)
自动布局干扰子视图帧更改似乎确实存在问题。在设置子视图的帧之前,我通过将translatesAutoresizingMaskIntoConstraints设置为false找到了绕过它的方法。这样我仍然可以为视图的其余部分允许自动布局,但它不会干扰我的自定义布局更改。
subview.setTranslatesAutoresizingMaskIntoConstraints(false);
subview.frame = frame;