2009-08-19 3 views
3

안녕하세요. 아래 그림과 같이 uiButton이 하위 뷰로 추가되었습니다. 사용자가 풍경에 전화를 회전 할 때 alt text http://img99.imageshack.us/img99/5244/portraitc.png자동 회전시 프레임 설정 후 UIButton이 터치에 응답하지 않습니다.

의 의견 및 버튼이로 위치를 변경해야 뷰가 세로 모드에 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

귀하의 문제는 귀하의 프레임 조정에 있다고 생각합니다. 내 직감은 회전이 실제로 이루어지기 전에 로직이 shouldAutorotateToInterfaceOrientation 안에 있기 때문에 로직과 관련이 있다고합니다. this article에서 수학 방식대로 해보고 도움이되는지 확인하십시오.

+0

감사합니다. 나는 그것을 시도하고 피드백과 함께 돌아올거야. 소린 –

+0

기사가 정말 유용했습니다, 감사합니다! 그것은 작동했습니다 :) –

1

나는 아직도 실제로 같은 문제 (1 년 후 ... iOS 3.0 호환성 필요)로 어려움을 겪고 있습니다. 회전 부분이 쉬웠다. 그러나 뷰와 버튼은 터치 및 이동/드래그 이벤트를 처리하지 않는 것 같습니다. 윈도우 (UIWindow)가 터치 이벤트를 받고 올바른 위치에 있는지 확인했습니다.

마치 화면의 1/3 (즉, 480-320)이 초상화에서 가로로 회전 한 후 수신기에 이벤트를 전파하지 않는 것과 같습니다.

회전 된보기 컨트롤러에 응답자가 없으므로 slf 별 링크의 예제가 도움이되지 않습니다.


나는 일부보기 파기 후에 그것을 알아 낸 것입니다. 그래서 viewController.view의 서브 뷰에서 viewController.view를 회전시키고 setNeedsLayout을 한 무리 씩 수행했습니다. 그러나, 내가해야 할 일은 [self.navigationController.view setNeedsLayout]입니다. 그 한 번의 부름은 나를 위해 모든 것을 고쳤습니다. 어떤 이유로 든 navigationController.view는 이전에 숨겨진 하위 뷰의 부분에 터치 이벤트를 전달하지 않았습니다 (프레임/경계에 관한 한). 사실 여러 가지 다른 문제도 수정되었습니다.

+0

보기가 겹치지 않는지 또는 사용자 상호 작용이 활성화되어 있는지 확인하십시오. 이것들은 현재 내 마음에 들어온다. –

+0

나, 그게 아니야. 나는 단지 약간의 파기 관찰 후 그것을 이해했다. 그래서 viewController.view의 서브 뷰에서 viewController.view를 회전시키고 setNeedsLayout을 한 무리 씩 수행했습니다. 그러나, 내가해야 할 일은 [self.navigationController.view setNeedsLayout]입니다. 그 한 번의 부름은 나를 위해 모든 것을 고쳤습니다. 어떤 이유로 든 navigationController.view는 이전에 숨겨진 하위 뷰의 부분에 터치 이벤트를 전달하지 않았습니다 (프레임/경계에 관한 한). 사실 여러 가지 다른 문제도 수정되었습니다. – Ephraim

0

나는 문제를 해결했다. 기본적으로해야 할 일은 [self.navigationController.view setNeedsLayout]이다.

= 320, 높이 = 480). 그때 M_PI/2 의해 self.view 회전 폭 I 어쩌면 잘못된 self.navigationController.view.frameself.view.frame으로 동일하고 모두 (X = 0이 있다고 인이 (Y = 0 이해 방법 및 select self.view에서 여러 프레임 조작을 수행했습니다.하위 뷰를 사용하여 모든 것을 애니메이션/위치/스케일로 올바르게 가져옵니다.

괜찮 았지만 네비게이션 컨트롤러는 320의 오른쪽에있는 self.view의 부분에 터치 이벤트를 기꺼이 알리지 않았습니다. 본질적으로이 self.navigationController.view.clipsToBounds이 사실이라면 그 부분을 보여주지 않았을 수도 있습니다 self.view의.

어쨌든 탐색 컨트롤러의보기에서 setNeedsLayout을 설정하면 문제가 해결되었습니다. 나는 이것이 다른 누군가를 돕기를 바랍니다. SorinA가 터치 이벤트를받지 않는 버튼으로 인해 발생했던 문제라고 생각합니다.

+0

이것은 아래에 게시 한 내 자신의 문제에 대한 내 해결책입니다. – Ephraim

관련 문제