如何检测以编程方式生成的 UIView 的旋转
Posted
技术标签:
【中文标题】如何检测以编程方式生成的 UIView 的旋转【英文标题】:How to detect rotation for a programatically generated UIView 【发布时间】:2012-08-25 22:20:53 【问题描述】:我有一个 UIView
正在以编程方式创建:
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
if (self)
self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.5];
UIImageView* closeButton = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"modal_close.png"]];
closeButton.frame = CGRectMake(self.frame.size.width*.89, self.frame.size.height*.09, closeButton.frame.size.width, closeButton.frame.size.height);
UIButton* button = [[UIButton alloc] initWithFrame:CGRectMake(self.frame.size.width*.89, self.frame.size.height*.09,20, 20)];
[button addTarget:self action:@selector(close) forControlEvents:UIControlEventTouchUpInside];
UIView* mainView = [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width*.1,self.frame.size.height*.1,self.frame.size.width*.8,self.frame.size.height*.8)];
mainView.backgroundColor = [UIColor whiteColor];
_displayMainView = mainView;
[self addSubview:_displayMainView];
[self addSubview:closeButton];
[self addSubview:button];
mainView = nil;
closeButton = nil;
return self;
如何检测旋转?这是作为另一个现有视图之上的模式。如果重要的话,这是一款仅限 iPad 的应用程序。
【问题讨论】:
你是指 UIVIew 的旋转角度,还是设备的方向? 查看这个出色的答案 - ***.com/a/3897243/194544 【参考方案1】:您可以让设备开始生成旋转通知:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
添加您自己的选择器作为设备旋转通知的观察者:
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];
然后编写您的通知处理程序
- (void)deviceOrientationDidChange:(NSNotification *)notification
//Obtain current device orientation
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
//Do my thing
记得在调用自定义 UIView 的 dealloc 方法时(或完成后)移除观察者,并停止生成设备更改通知。
-(void) dealloc
[[NSNotificationCenter defaultCenter] removeObserver: self];
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
这对您的问题有帮助吗?
【讨论】:
不要使用它,因为它会激活设备的加速度计。在您致电endGeneratingDeviceOrientationNotifications
之前,加速度计将保持活动状态。但是如果你的视图是一个单元格视图,它永远不会被释放,直到你释放表视图(这永远不可能发生)。您可以改用if UIScreen.main.bounds.height > UIScreen.main.bounds.width
。【参考方案2】:
我正在重写@clearwater82 对 Swift 3 的回答,因为他的方法是我最终使用的方法:
我在我的视图的init
方法中添加了以下代码(对于控制器,它将在它的viewDidLoad
方法中):
// Handle rotation
UIDevice.current.beginGeneratingDeviceOrientationNotifications()
NotificationCenter.default.addObserver(
self,
selector: #selector(self.orientationChanged(notification:)),
name: NSNotification.Name.UIDeviceOrientationDidChange,
object: nil
)
然后我将orientationChanged
方法添加到我的视图中。
你可以随意重命名这个方法,只要记住在上面的代码sn-p中也要重命名:
// Called when device orientation changes
@objc func orientationChanged(notification: Notification)
// handle rotation here
最后我添加了deinit
方法来在视图被移除时移除不必要的通知:
deinit
NotificationCenter.default.removeObserver(self)
UIDevice.current.endGeneratingDeviceOrientationNotifications()
最后一个 sn-p 所做的是从通知观察者中删除视图本身,然后阻止设备生成其他旋转通知。 这种方法是我需要的,但您可能不想在删除视图时停止生成通知。
希望对你有用,加油
【讨论】:
名称:UIDevice.orientationDidChangeNotification。斯威夫特 5【参考方案3】:我认为你有两个选择:
-
您将视图放在自定义
UIViewController
中并覆盖shouldAutorotateToInterfaceOrientation:
方法以对您想要支持的所有方向返回YES。视图控制器将自动旋转并调整内容(您的视图)的大小。您只需确保拥有正确的 autoresizeMask(或约束,如果您使用的是自动布局)。
您可以使用加速度计直接观察设备方向的变化。然后,您可以在需要时调整视图。
如果可以的话,这确实是您应该选择的第一种方法。
【讨论】:
以上是关于如何检测以编程方式生成的 UIView 的旋转的主要内容,如果未能解决你的问题,请参考以下文章