我正在尝试实现viewWillTransitionToSize
iOS 8 中引入的新方法(所有其他旋转方法已被弃用)。我想知道现在的等价物didRotateFromInterfaceOrientation
是什么,因为我们需要执行许多清理任务,而且我看不到我们可以分配的块UIViewControllerTransitionCoordinator
以便在“过渡”到新的时被调用大小完成。谢谢。
问问题
62108 次
7 回答
262
好的,找到了,只需要使用animateAlongsideTransition:completion:
传递的方法UIViewControllerTransitionCoordinator
。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
// do whatever
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
}];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
于 2014-06-05T23:45:48.663 回答
72
奇怪的答案的Swift版本
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in
let orient = UIApplication.sharedApplication().statusBarOrientation
switch orient {
case .Portrait:
println("Portrait")
// Do something
default:
println("Anything But Portrait")
// Do something else
}
}, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
println("rotation completed")
})
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
于 2015-03-10T08:12:33.433 回答
10
iOS 10.3 和斯威夫特 3
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { (_) in
let orient = newCollection.verticalSizeClass
switch orient {
case .compact:
print("Lanscape")///Excluding iPads!!!
default:
print("Portrait")
}
}, completion: { _ in
print("rotation completed")
})
super.willTransition(to: newCollection, with: coordinator)
}
于 2017-04-11T12:00:29.990 回答
7
Swift 3中接受的答案:
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { (_) in
let orient = UIApplication.shared.statusBarOrientation
switch orient {
case .portrait:
print("Portrait")
// Do something
default:
print("Anything But Portrait")
// Do something else
}
}, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
print("rotation completed")
})
super.willTransition(to: newCollection, with: coordinator)
}
这对我来说可以
于 2016-11-18T16:34:57.313 回答
5
因为问题是:什么相当于didRotateFromInterfaceOrientation
我想我会贡献下面的代码:
@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
NSLog(@"User has rotated to landscape");
} else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
NSLog(@"User has rotated to portrait");
}
}
@end
我在模拟器中的 iPhone 上进行测试,但如果我使用 iPad 进行测试,我的打印语句将不会运行,因为 traitsCollection 不会改变。
这很奇怪,因为这正是 Apple推荐的:
- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
[super traitCollectionDidChange: previousTraitCollection];
if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
|| self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
// your custom implementation here
}
}
于 2016-01-27T21:09:44.770 回答
3
[[UIApplication sharedApplication] statusBarOrientation]
在 iOS9 中已弃用,您必须针对各种设备测试UITraitCollection。
override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
...
}
}
于 2015-10-19T12:50:22.247 回答
1
在 Ipad 上没有特征集合的变化,所以这里是你如何检测从开始到完成的旋转。这是 Swift 5 的语法:
override func viewWillTransition(to size: CGSize, with coordinator:
UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { [unowned self] _ in
self.view.backgroundColor = UIColor.blue
print("rotation in progress")
}) { [unowned self] _ in
self.view.backgroundColor = UIColor.green
print("rotation complete")
}
}
于 2019-12-04T14:50:41.123 回答