如何检测旋转的程序生成的UIView(How to detect rotation for a pr

2019-07-31 04:49发布

我有一个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的唯一的应用程序,如果该事项。

Answer 1:

我认为你有两个选择:

  1. 你把视图在一个自定义UIViewController并重写shouldAutorotateToInterfaceOrientation:方法返回YES所有你想支持的方向。 视图控制器会自动旋转和调整的内容(你的观点)。 你只需要确保有正确的autoresizeMask(或约束,如果你使用自动布局)。
  2. 您可以直接观察到的变化与加速度计的设备方向。 然后在需要的时候,你可以调整你的看法。

这是真的,如果你能,你应该选择第一种方法。



Answer 2:

你可以让设备开始产生旋转的通知:

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

请记住删除观察者时,你的dealloc方法自定义的UIView被调用(或者当你完成),并停止发电设备变更通知以及。

-(void) dealloc{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
}

这是否帮助在所有与你的问题?



Answer 3:

我重写@ clearwater82的答案斯威夫特3,因为他的做法是一个我最终使用:

我说在我看来的下面的代码init方法(控制器这将是它viewDidLoad方法):

// Handle rotation
UIDevice.current.beginGeneratingDeviceOrientationNotifications()
NotificationCenter.default.addObserver(
    self,
    selector: #selector(self.orientationChanged(notification:)),
    name: NSNotification.Name.UIDeviceOrientationDidChange,
    object: nil
)


然后我加入了orientationChanged方法我的看法。 如你所愿,只记得它在上面的代码段还重命名可以重命名这个方法:

// Called when device orientation changes
@objc func orientationChanged(notification: Notification) {
    // handle rotation here
}


最后,我加入deinit方法当视图被去除以消除不必要的通知:

deinit {
    NotificationCenter.default.removeObserver(self)
    UIDevice.current.endGeneratingDeviceOrientationNotifications()
}

这是什么最后的片段确实是从通知观察家删除视图本身,然后从其他产生旋转的通知停止该设备。 这个方法是我需要什么,但你可能不希望从视图时删除停止生成通知。

我希望这是有用的,欢呼



文章来源: How to detect rotation for a programatically generated UIView