- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读过帖子说 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
,它使用自动布局在两个方向上都尽可能大。 contentMode
是 scaleAspectFit
,因此图像本身会在方向更改时自动调整大小。用户可以使用 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/
我正在使用 viewWillTransitionToSize 来检测设备何时旋转到横向。根据目标大小,我可以检测是否朝向风景并根据需要调整我的特征... override func viewWillT
在我的 ios8 扩展 ActionViewController(UIViewController 的子类)中 viewWillTransitionToSize:withTransitionCoord
我想检测不同 ViewController 中的方向变化。我使用了这段代码 override func viewWillTransitionToSize(size: CGSize, withTrans
我读过帖子说 didRotate(fromInterfaceOrientation is deprecated and advising using viewWillTransitionToSize.
我的 swift 3 代码中有这个方法: func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinat
我正在开发一个针对 iOS 8.0+ 的应用程序,使用 Swift 2.2 和 Realm 1.0.2 作为我的数据存储。 我在崩溃日志中看到很多与此代码相关的崩溃,尽管我目前无法自己重现它们: //
尝试了新的旋转方法,我需要知道设备是否正在旋转,以便推迟和取消旋转时不需要的操作。 -(void)viewWillTransitionToSize:(CGSize)size withTransitio
我目前有一个名为 Page2 的 UiViewController现在,如果将 Iphone 的方向更改为横向,则会调用以下方法,这非常好 -(void) viewWillTransition
我正在为 iPad Air 2 和 iPad Mini 4 实现分屏功能。我正在尝试检测分屏大小何时发生变化。当作为主应用程序运行时,viewWillTransitionToSize 或 willTr
iOS 8 带来了两种处理屏幕旋转的新方法。 ViewWillTransitionToSize 和 willTransitionToTraitCollection。 我的问题是,如何停止这些方法中的轮
谁能解释这两种方法之间的区别? The docs for UIViewController明确声明 viewWillTransitionToSize 应该用于管理旋转,但点击进入 UIContentC
我试图通过覆盖响应 iPad 上的旋转 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)c
我有一个 View Controller ,在两个嵌套 View 中有一个 View 层次结构,这些嵌套 View 放置有自动布局约束。然后我在代码中将一些 UIView 放入其中一个 View 中,
我正在使用 viewWillLayoutSubviews 来检测方向变化,但由于在 iOS 8 和 Xcode 6 中已弃用,我需要使用新的 viewWillTransitionToSize。我的问题
当我旋转设备时,我正在使用 viewWillTransitionToSize 来调整我的滑出菜单,但它似乎在 Swift 3 中被破坏了?谁能帮我解决这个问题?我的代码如下所示: func viewW
我尝试用 3 个页面创建 UIPageVC。一切都很好,但是当我旋转设备并在此更改页面之后,我将看到仅旋转页面,该页面在旋转时刻在 PageVC 中解决。 当我旋转任何页面时,如何旋转其他 2 个 V
很多人都讨论过模仿原生 iOS 相机应用程序的技术(其中 UI 元素随着设备旋转而原地旋转)。其实我之前问过一个问题here .大多数人让您锁定 UI 的方向,然后仅对您想要旋转的元素强制进行转换。这
viewWillTransitionToSize 方法在设备方向上被调用。问题是这是在所有 View Controller 上调用的。如果 View Controller A 使用 push segu
我有一个 UICollectionView,它由弹出窗口显示。 UICollectionView 包含 16 行,每行 10 个单元格,我希望这些单元格填满 UICollectionView 的宽度。
将我的 xcode 更新到 xcode9 后,我收到了一个已弃用警告列表,但我不知道如何修复它 “willRotateToInterfaceOrientation:duration:”已弃用:首先在
我是一名优秀的程序员,十分优秀!