pix*_*x0r 3 iphone rotation uiviewcontroller
我有一个UIViewController我用来控制"弹出"视图,以便在整个应用程序中查看图像.它支持自动旋转,因为无论方向如何,它都会自动调整图像大小.这很好用,但只是我第一次初始化和显示视图控制器.当它关闭时,我UIView将从我的视图层次结构中删除并释放视图控制器 - 但是下次我实例化并将其添加到我的视图层次结构时,它会-shouldAutorotateToInterfaceOrientation在手机旋转时停止接收消息.
这是我实例化和显示它的方式:
popupVC = [[PopupVC alloc] init];
[popupVC viewWillAppear:NO];
[[[UIApplication sharedApplication] keyWindow] addSubview:popupVC.view];
[popupVC viewDidAppear:NO];
Run Code Online (Sandbox Code Playgroud)
这是我完成时删除/释放它的方法:
[popupVC viewWillDisappear:NO];
[popupVC.view removeFromSuperview];
[popupVC viewDidDisappear:NO];
[popupVC release];
popupVC = nil;
Run Code Online (Sandbox Code Playgroud)
我已经尝试循环遍历[[UIApplication sharedApplication] keyWindow]子视图,看看我的弹出视图是不是在顶部,但它始终是.并且每次都有不同的地址,所以我知道它是视图控制器类的不同实例.
根据要求,这是完整的loadView方法PopupVC:
- (void)loadView {
UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
myView.backgroundColor = self.overlayColor;
myView.autoresizesSubviews = NO;
myView.hidden = YES;
myView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.view = myView;
[myView release];
_isVisible = NO;
UIView *myMaskView = [[UIView alloc] initWithFrame:self.view.bounds];
myMaskView.backgroundColor = [UIColor clearColor];
myMaskView.clipsToBounds = YES;
myMaskView.hidden = YES;
myMaskView.autoresizesSubviews = NO;
myMaskView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:myMaskView];
self.imageMaskView = myMaskView;
[myMaskView release];
UIImageView *myImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
myImageView.center = self.view.center;
myImageView.hidden = NO;
myImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHeight;
[self.imageMaskView addSubview:myImageView];
self.imageView = myImageView;
[myImageView release];
UIButton *myImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
myImageButton.frame = self.view.frame;
myImageButton.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHeight;
[myImageButton addTarget:self action:@selector(clickImage:) forControlEvents:UIControlEventTouchUpInside];
[self.imageMaskView addSubview:myImageButton];
self.imageButton = myImageButton;
UIActivityIndicatorView *myActivityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
myActivityView.hidden = YES;
[self.view addSubview:myActivityView];
myActivityView.center = self.view.center;
self.activityView = myActivityView;
[myActivityView release];
}
Run Code Online (Sandbox Code Playgroud)
该shouldAutorotateToInterfaceOrientation处理器是不是自定义代码来旋转响应事件的地方.它的目的只是告诉操作系统您的视图控制器可以旋转.如果你想要自定义代码来处理你应该覆盖的旋转事件 - didRotateFromInterfaceOrientation或者根据你的需要使用其他类似的回调方法:
willRotateToInterfaceOrientation:duration: willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation: willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:didAnimateFirstHalfOfRotationToInterfaceOrientation: willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration: 请参阅开发人员文档中的自动轮转视图.
我认为这可能是新OS 3.0中的一个错误.解决此问题的方法是在启用beginGeneratingDeviceOrientationNotifications后使用NSNotificationCenter.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
}
-(void) receivedRotate: (NSNotification *) notification {
DebugLog(@"ORIENTATION CHANGE");
UIDeviceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];
if(interfaceOrientation == UIDeviceOrientationPortrait) {
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0));
self.view.bounds = CGRectMake(0, 0, 320, 480);
}
else if(interfaceOrientation == UIDeviceOrientationLandscapeLeft) {
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
self.view.bounds = CGRectMake(0, 0, 480, 320);
}
else if(interfaceOrientation == UIDeviceOrientationLandscapeRight) {
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
self.view.bounds = CGRectMake(0, 0, 480, 320);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6624 次 |
| 最近记录: |