我注意到,在从纵向到横向的方向更改后,我不再为我视图的某些部分进行触摸开始事件了。我想这是因为我没有告知我的UIView关于设备旋转后窗口框架的尺寸变化。
我正在以编程方式设置所有内容(UIWindow,UIViewController,UIView),如下所示:
myViewController = [[myUIViewController alloc] init];
myWindow = [[UIWindow alloc] initWithFrame: rect];
myView = [[myUIView alloc] initWithFrame: [myWindow bounds]];
[myViewController setView:myView];
[myWindow addSubview:myView];
[myWindow setFrame:rect];
[myWindow makeKeyAndVisible];
当我收到didRotateFromInterfaceOrientation通知时,我正在更新这样的窗口框架:
[[[self view] window] setFrame:rect];
但在那之后,我的UIView不再为所有区域获取touchesXXX事件。似乎只有前一帧的区域仍在报告事件。所以我的问题是:在didRotateFromInterfaceOrientation中还有什么需要做的,以告知我的UIView有关尺寸变化的信息吗?
感谢您的帮助!
编辑:我是否必须在didRotateFromInterfaceOrientation()上重新定位UIView,还是自动完成?我注意到当方向改变时,我的UIView的“transform”属性被设置为变换矩阵。但是,这使我很难重新定位我的视图。文档说当转换处于活动状态时不能使用“frame”属性,因此我尝试修改“center”属性以重新定位我的视图,但这也无法正常工作。我想将视图移动到左上角,所以我将“center”设置为(screenwidth / 2,screenheight / 2),但它没有正确定位视图:(任何想法或信息必须要做什么才能获得在定向模式下的事件?
答案 0 :(得分:0)
我遇到了同样的问题,我认为这是一个框架问题。
我必须根据方向手动设置rects,并在主视图上设置userInteractionEnabled,如:
if (appOrientation == 0)
appOrientation = [UIApplication sharedApplication].statusBarOrientation;
if (appOrientation == UIInterfaceOrientationLandscapeLeft || appOrientation == UIInterfaceOrientationLandscapeRight) {
[[UIApplication sharedApplication] setStatusBarHidden:YES];
myView.frame = CGRectMake(0, 0, 1024, 768);
} else {
[[UIApplication sharedApplication] setStatusBarHidden:YES];
myView.frame = CGRectMake(0, 0, 768, 1024);
}
myView.userInteractionEnabled = YES;
答案 1 :(得分:0)
好的我知道这是一个老问题,但这就是我解决这个问题的方法。
在我的情况下,我有一个故事板,其视图将以纵向显示或强制显示为横向模式,具体取决于用户设置。
我的应用程序始终显示statusBar,除非我显示此视图。
为了使这一切工作,必须在viewWillAppear方法中应用转换。我首先在viewDidAppear方法中使用了以下代码,并且我猜想了touchesBegan事件的边界。
这是viewWillAppear代码:
- (void)viewWillAppear:(BOOL)animated
{
// Hide the status bar
[[UIApplication sharedApplication] setStatusBarHidden:YES];
// This is to offset the frame so that the view will take the fullscreen once the status bar is hidden
self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);
// If view is to be displayed in landscape mode
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"orientation"])
{
// Change status bar orientation
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft];
// Turn the view 90 degrees
[self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/2)];
// Set the frame and the bounds for the view
// Please Note: Frame size has to be reversed for some reason.
[self.navigationController.view setFrame: CGRectMake(0,0,320,480)];
[self.navigationController.view setBounds: CGRectMake(0,0,480,320)];
// Make sure user can interact with view
[self.navigationController.view setUserInteractionEnabled:YES];
}
}
任何其他必须在布局方面发生的事情都必须在viewDidAppear方法中发生。例如,我有一个覆盖整个视图的图像,框架必须根据方向设置。在viewWillAppear中设置框架给出了奇怪的结果,但是相同的代码在viewDidAppear中完美运行。
希望这可以帮助某人,因为我在这件事上撞了6个小时。