在旋转设备

时间:2017-01-30 23:38:52

标签: ios swift uistackview cornerradius viewwilltransitiontosize

我已经实现了一个堆栈视图,该视图与我的主视图控制器上的弹出框内的图像和标签以及文本和按钮成比例填充。当我转向popover时,我使用视图将显示覆盖以定义图像的角半径,我将其称为ProfileImage的高度为1/2,使其显示为圆形。

当我旋转设备时,堆栈会重新计算并更改profileImage的大小。我试图使用下面的代码来调整角半径,以便在视图转换时它是一个圆。我在完成块和沿着转换块尝试了这段代码。

旋转设备时,角半径由OLD方向的图像尺寸设定,而不是按新方向设定。感觉好像过渡到新方向,然后堆栈重新计算。在此之前,角半径似乎更新。我想帮助理解如何在设备旋转后调用图像的高度属性,该属性将是新视图中的高度,并且堆栈将根据新方向重新计算图像大小。

感谢您提供的任何指导。请参阅下面的相关代码:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { context in
        context.viewController(forKey: UITransitionContextViewControllerKey.from)
    }, completion: {(context) -> Void in
         self.view.layoutSubviews()
        self.ProfileImage.layer.cornerRadius = self.ProfileImage.bounds.size.height / 2
        print(self.ProfileImage.frame.size.height)
    })  
}

1 个答案:

答案 0 :(得分:0)

一个接近但不完美的答案是在viewWillLayoutSubviews()中而不是在viewWillTransition()中设置角半径,因为UIStack视图在旋转后不在其中放置其子视图。

override func viewWillLayoutSubviews() {
   self.ProfileImage.layer.cornerRadius = self.ProfileImage.frame.size.height / 2 
}

感谢本文的受访者指出我正确的方向: View frame changes between viewWillAppear: and viewDidAppear:

我现在的问题是,在viewDidLayoutSubviews调用之后,UIImage视图的大小已经改变了几个像素。在DidLayoutSubviews之后堆栈视图或自动布局重新调用时是否会调用另一个函数?

该应用看起来不错,但还有其他一些我不理解的行为。