在layoutSubviews中设置子视图框架不会保留

时间:2015-02-17 01:08:10

标签: ios objective-c cocoa-touch swift storyboard

我有一个自定义的UIView子类,它抓取layoutSubviews中的所有子视图,并根据一些自定义设置改变它们的布局/大小。

如果我以编程方式创建此视图,则一切正常但是如果我将此UIView子类添加到故事板并在故事板中添加一些子视图,则布局更改似乎不会持续存在。

我可以使用断点看到以下逻辑流程。

  1. VC&自定义视图已初始化

  2. 调用VC viewDidLayoutSubviews。 (我在这里什么都不做,只是观察它是用断点调用的)

  3. 调用自定义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
    
  4. 再次调用VC viewDidLayoutSubviews。但是,当我在这里打印子视图时,我可以看到他们再次回到原始帧。

    po customView.subviews
    
  5. 显示视图且未调整帧数。

  6. 如果我再次调用layoutSubviews,子视图帧最终会调整,但只有在视图出现之后才会进行调整。

    override func viewDidLayoutSubviews() {
        customView?.layoutSubviews();
    }
    

    此流程如下:

    1. VC&视图已初始化

    2. VC viewDidLayoutSubviews名为

    3. layoutSubviews连续两次调用

    4. 显示视图并且子视图尚未重新调整,即使它们在通过调试器打印时位于layoutSubviews中。

    5. VC - 再次调用viewDidLayoutSubviews

    6. 再次调用layoutSubviews。

    7. 您可以看到子视图调整但是为时已晚,因为用户可以看到子视图“跳转”到位。

    8. 关于我在这里缺少什么的想法?子视图帧肯定是正确设置的,但它们只是在视图出现之前被还原。

      我恰好正在使用swift,但目标C中的响应非常受欢迎。

1 个答案:

答案 0 :(得分:2)

自动布局干扰子视图帧更改似乎确实存在问题。在设置子视图的帧之前,我通过将translatesAutoresizingMaskIntoConstraints设置为false找到了绕过它的方法。这样我仍然可以为视图的其余部分允许自动布局,但它不会干扰我的自定义布局更改。

subview.setTranslatesAutoresizingMaskIntoConstraints(false);
subview.frame = frame;