gpt4 book ai didi

swift - 使用 viewWillTransitionToSize 检测方向变化

转载 作者:行者123 更新时间:2023-11-28 15:54:26 25 4
gpt4 key购买 nike

我读过帖子说 didRotate(fromInterfaceOrientation is deprecated and advising using viewWillTransitionToSize.

但每当我尝试使用此功能时,例如

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("Landscape")

} else {

imageView.image = UIImage(named: const)
}

我收到一条错误消息,提示方法未覆盖其父类(super class)的任何方法。我尝试在 View Controller 及其 View 中使用该函数,但无济于事。

最佳答案

如果您使用的是 Swift 3,签名是(对于 UIViewController):

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
}

看看是否有帮助。

在旋转后应该给你尺寸的替代方法是 willWillLayoutSubviews()viewDidLayoutSubviews()。(我使用前者。)注意:两者都可以称为多个一次旋转。这是我的代码....

View Controller :

var initialOrientation = true
var isInPortrait = false

override func viewWillLayoutSubviews() {
super.viewDidLayoutSubviews()
if initialOrientation {
initialOrientation = false
if view.frame.width > view.frame.height {
isInPortrait = false
} else {
isInPortrait = true
}
// call initial layout, isInPortrait is set
} else {
if view.orientationHasChanged(&isInPortrait) {
// orientation has changed, isInPortrait is set
}
}
}

UIView 扩展:

extension UIView {
public func orientationHasChanged(_ isInPortrait:inout Bool) -> Bool {
if self.frame.width > self.frame.height {
if isInPortrait {
isInPortrait = false
return true
}
} else {
if !isInPortrait {
isInPortrait = true
return true
}
}
return false
}
}

编辑:

16 个月后,有人问我是否包含了拼写错误 - 应该是 viewWillLayoutSubviews 还是 viewDidLayoutSubviews。完整的答案是“视情况而定”。

  • 这个问题的基准是关于使用 viewWillTransitionToSize 的弱点,也就是说,如果您的目标是 iPad 设备,尺寸类别不会改变。 (另外,请注意覆盖的 Will 部分 - 它在方向更改之前触发。

  • 根据我的经验,无法“保证”viewWillLayoutSubviews viewDidLayoutSubviews 只会被调用一次。但我多年来的测试结果显示 viewDidLayoutSubviews 更有可能只被调用一次。

  • 此外,在 View Controller 生命周期中,viewDidLoad触发*至少两次调用viewWillLayoutSubviews,初始调用具有CGRect.zero 的框架。

因此,如果您需要了解autolayout 约束激活/停用的方向变化,viewWillLayoutSubviews 可以正常工作。但是,如果您希望操作 subview 框架,viewDidLayoutSubviews 是合适的地方。

我的最新项目涉及一个 UIImageView,它使用自动布局在两个方向上都尽可能大。 contentModescaleAspectFit,因此图像本身会在方向更改时自动调整大小。用户可以使用 subview “构建” mask (移动和调整大小),因此自动布局在这里不起作用。此外,我需要将此 mask “约束”到实际图像。

因此,我需要通过同时方向更改的“将要”和“已执行”部分来“手动”调整/重新定位蒙版框架。这是我现在使用的代码。 UIView 扩展仍然是一样的,变化仅在 UIViewController 中。

var initialOrientation = true
var isInPortrait = false
var orientationDidChange = false

override func viewWillLayoutSubviews() {
super.viewDidLayoutSubviews()
if initialOrientation {
initialOrientation = false
if view.frame.width > view.frame.height {
isInPortrait = false
} else {
isInPortrait = true
}
orientationWillChange()
} else {
if view.orientationHasChanged(&isInPortrait) {
orientationWillChange()
}
}
}
func orientationWillChange() {
// capture the old frame values here, storing in class variables
orientationDidChange = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if orientationDidChange {
// change frame for mask and reposition
orientationDidChange = false
}

}

关于swift - 使用 viewWillTransitionToSize 检测方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com