你好我的应用程序我有一些uiButtons作为子视图添加到视图如下图所示。 alt text http://img99.imageshack.us/img99/5244/portraitc.png
当用户以横向旋转手机时,视图和按钮必须将位置更改为: alt text http://img193.imageshack.us/img193/5931/landscapeq.png
最初,当视图处于纵向模式时,按钮会响应触摸。如果我倾斜手机按钮移动,一切看起来都很好,就像在第二个图像和按钮响应触摸。如果我将手机倾斜回到纵向模式,按钮向后移动它们看起来不错,但它们不响应触摸。如果我改回横向按钮可以工作......
我的按钮是这样创建的:
nextNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25)];
[nextNewsP setImage:[UIImage newImageFromResource:@"next_arrow.png"] forState:UIControlStateNormal];
[nextNewsP addTarget:self action:@selector(nextNewsAction:) forControlEvents:UIControlEventTouchUpInside];
[nextNewsP setShowsTouchWhenHighlighted:TRUE];
[bottomTools addSubview:nextNewsP];
[nextNewsP release];
previousNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25)];
[previousNewsP setImage:[UIImage newImageFromResource:@"previous_arrow.png"] forState:UIControlStateNormal];
[previousNewsP addTarget:self action:@selector(previousNewsAction:) forControlEvents:UIControlEventTouchUpInside];
[previousNewsP setShowsTouchWhenHighlighted:TRUE];
[bottomTools addSubview:previousNewsP];
[previousNewsP release];
bottomTools是一个视图,也可以添加为这样的子视图:
[self.view addSubview:bottomTools];
[bottomTools release];
我的shouldAutorotateToInterfaceOrientation函数如下所示:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[UIView beginAnimations:@"moveViews" context: nil];
if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
NSLog(@"set frames for portrait");
closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 30, 2, 23, 25);
newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.width - 10, 22);
internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 55, 5, 18, 18);
industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22);
bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height-40, [[UIScreen mainScreen] bounds].size.width, 40);
nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25);
previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25);
}
else
{
NSLog(@"set frames for landscape");
closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 30, 2, 23, 25);
newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.height - 10, 22);
internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 55, 5, 18, 18);
industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22);
bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.width-40, [[UIScreen mainScreen] bounds].size.height, 40);
nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 40, 10, 25, 25);
previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 85, 10, 25, 25);
}
[UIView commitAnimations];
return YES;
}
你有过类似的问题吗? 先感谢您, 索林答案 0 :(得分:1)
我实际上仍在努力解决同样的问题(一年后......需要iOS 3.0兼容性)。旋转部分很容易。但是,视图和按钮似乎不会处理触摸和移动/拖动事件。我已经验证窗口(UIWindow)正在接收触摸事件并在正确的位置。
就好像屏幕的最后1/3(即480-320)在从纵向旋转到横向后不会将事件传播到接收器。
slf链接中的示例没有用,因为旋转的视图控制器没有响应器。
我只是在挖掘了一些视图后想出来了。所以,我正在旋转viewController.view并在viewController.view的子视图上做一堆setNeedsLayout。但是,我需要做的是[self.navigationController.view setNeedsLayout]。那一个电话为我修好了一切。无论出于何种原因,navigationController.view都没有将触摸事件传递给先前隐藏的子视图部分(就帧/边界而言)。这实际上也解决了许多其他问题。
答案 1 :(得分:0)
我认为您的问题出在帧调整中。我的直觉告诉我它与shouldAutorotateToInterfaceOrientation
内部的逻辑有关,因为这发生在旋转实际完成之前。尝试按照this article中的方式进行数学运算,看看是否有帮助。
答案 2 :(得分:0)
我已经解决了我遇到的问题..我基本上需要做[self.navigationController.view setNeedsLayout]
。
我理解这一点的方式(可能不正确的是self.navigationController.view.frame
与self.view.frame
相同并且两者都等于(x = 0,y = 0,width = 320,height = 480)。然后我将self.view
轮换为M_PI/2
并对select self.view.subviews进行了一些帧操作,以便将所有内容设置为动画/位置/缩放。
这很好但是导航控制器不愿意承认触摸事件到自我的部分。查看320的权利。实质上,如果这个self.navigationController.view.clipsToBounds
是真的,它甚至可能没有显示了self.view的一部分。
无论如何,在导航控制器的视图上设置setNeedsLayout解决了这个问题。我希望这有助于其他人。我怀疑这也是SorinA在按钮没有触摸事件时遇到的问题。