当 viewController 的视图变得可见时,视图的框架设置不正确

Posted

技术标签:

【中文标题】当 viewController 的视图变得可见时,视图的框架设置不正确【英文标题】:frame of views not set correctly when viewController's views become visible 【发布时间】:2015-09-01 15:45:51 【问题描述】:

我正在将一个 imageView 添加到一个已经存在的 imageView 以完全覆盖它。这是代码,但我不希望你完全理解它,因为它是一团糟,并不重要。

var customImageView = returnImageViewWithIdentifier(imageViewIdentier)!

                    customImageView.bounceImageViewBounds = CGRect(origin: CGPointMake(0, 0), size: CGSize(width: customImageView.frame.width, height: customImageView.frame.height))
                    customImageView.bounceImageView = UIImageView(frame: customImageView.bounceImageViewBounds)
                    customImageView.bounceImageView.image = UIImage(named: nameOfImage)
                    customImageView.hasImage = true

                    customImageView.startImageViewFrame = customImageView.frame

                    customImageView.middleView = UIView(frame: customImageView.startImageViewFrame)
                    customImageView.bounceImageView.clipsToBounds = true
                    customImageView.bounceImageView.layer.cornerRadius = 3


                    self.cubeView.addSubview(customImageView.middleView)
                    customImageView.middleView.addSubview(customImageView.bounceImageView)

快速回顾:customImageView 是被bounceImageView 遮挡的,它是customImageView 的一个变量。没关系。

当使用此代码实现按钮的 IB 操作方法并按下按钮时,它会做得很好。当它在 viewDidLoad、viewDidAppear、vievDidLayoutSubviews 中执行时,它会中断。根据我执行此代码的位置,bounceImageView(遮盖 customImageView 的那个)会向下移动一点或向右移动大约英寸(2.54 厘米)。它不会完全掩盖它下面的 imageView。在所有布局都设置好后执行代码时(例如,当我按下按钮时),它的功能就像它应该的那样。

我感觉这与评估约束有关。由于应用程序误解了所有视图的位置,因此未正确设置顶视图的框架。对于此类问题,我非常感谢一些调试信息或可能的解决方案。

【问题讨论】:

您可以添加屏幕截图以了解发生了什么吗?还有startImageViewFramebounceImageViewBounds 是什么?人们不知道该属性背后存储了哪些值,以及内部发生了什么。你能解释或分享更多代码吗? 我完全理解你。这可能是我这辈子写过的最丑的代码,这就是我如此稀缺的方式。我稍后会编辑我的答案,但这并不重要。我要确定的一点是,如果在按钮的 IB 操作方法中实现此代码运行良好,但在 viewDidLoad 和类似方法中实现时会中断。 【参考方案1】:

我已经把代码放在这个函数的闭包中,并在viewDidAppear中调用它。

func delay(delay:Double, closure:()->()) 
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    

我不知道它为什么会起作用。即使我将延迟设置为 0.0,它也能正常工作。主线接缝取悦系统。

【讨论】:

以上是关于当 viewController 的视图变得可见时,视图的框架设置不正确的主要内容,如果未能解决你的问题,请参考以下文章

从 iphone 上的 push segue 导航返回时,顶部导航栏变得可见

我怎样才能捕捉到视图变得可见

WKWebView 显示灰色背景并且 pdf 内容在 viewcontroller 开关上变得不可见

当从 iOS 中的另一个故事板场景调用 viewController 时,表视图变得空白(加载或重建)

如何检查视图而不是 viewController 是不是可见?

在视图变得不可见后执行任务