ios - 如何使用 StackView 中 subview 的属性设置为按比例填充,因为它在旋转设备后重新计算

标签 ios swift uistackview cornerradius viewwilltransitiontosize

我已经实现了一个堆栈 View ,其中按比例填充了主视图 Controller 上方弹出窗口内的图像、标签、文本和按钮。当我转到弹出窗口时,我使用 View 将出现覆盖来定义图像的角半径,我将 ProfileImage 称为其高度的 1/2,以便它显示为圆形。

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

当我旋转设备时,角半径由旧方向的图像大小设置,而不是新方向的图像大小。感觉好像发生了向新方向的过渡,然后堆栈重新计算自身。拐角半径似乎在此发生之前更新。我希望帮助理解如何调用图像的高度属性,该属性将是设备旋转后新 View 中的高度,并且堆栈根据新方向重新计算图像大小。

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

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)
    })  
}

最佳答案

一个接近但不完美的答案是在 viewWillLayoutSubviews() 而不是 viewWillTransition() 中设置角半径,因为 UIStack View 在旋转之后而不是在旋转期间布置其 subview 。

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

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

<小时/>

我现在的问题是,在 viewDidLayoutSubviews 调用之后,UIImage View 的大小以某种方式改变了几个像素。当堆栈 View 或自动布局在 DidLayoutSubviews 之后重新计算时,是否还会调用另一个函数?

该应用程序看起来不错,但发生了一些我不明白的其他行为。

关于ios - 如何使用 StackView 中 subview 的属性设置为按比例填充,因为它在旋转设备后重新计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947332/

相关文章:

ios - 即使应用程序更新后,持久数据仍然导致应用程序崩溃

ios - 获取 UIStackView 中的第一个 UIButton

ios - UIStackView 内嵌 UIStackView 对齐

swift - 如何对在单独函数中创建的 UIStackView 元素进行动画处理

ios - 我们如何远程关闭推送通知?

ios - 从 UIImageView 获取主色的坐标

android - 用Swift写的Cocos2D-Swift代码能移植到Android吗?

ios - 为未调用的 UIButton 添加目标

ios - 在 Swift 中 segue 之后从堆栈中移除(删除) View /viewController 的正确方法

iphone - 如何让 Sprite 跟随轨迹?