2012-07-01 6 views
1

장치 방향이 비동기 적으로 UIView를 업데이트하는 데 문제가 있습니다. I는 orientationChanged 방법에목표 c : 장치 방향으로 UIView를 비동기 적으로 업데이트하십시오.

- (void)viewDidLoad{ 
[super viewDidLoad]; 
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged) name:UIDeviceOrientationDidChangeNotification object:nil]; 
[self initialize];} 

아래로의 viewDidLoad에서 디바이스 배향을 구현 한 I 초기화 방법은 코드를

-(void)orientationChanged { 
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; 

if(UIInterfaceOrientationIsLandscape(orientation)){ 
    UINib *nib = [UINib nibWithNibName:@"ConsoleViewControllerLandscape" bundle:nil]; 
    UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
    self.view = portraitView; 

    [self initialize]; 

} else { 
    UINib *nib = [UINib nibWithNibName:@"ConsoleViewController" bundle:nil]; 
    UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
    self.view = portraitView; 

    [self initialize]; 

} 

따라 한 사실

[self performSelectorOnMainThread:@selector(arrangeAsynchronously) withObject:nil waitUntilDone:NO]; 
- (void) arrangeAsynchronously{ 
    //Some complex calculation and finally 
[self.view addSubview:imageview]; 
} 

같은 코드 비동기 UI를 업데이트 문제는 방향 변경된 imageView가 기본보기에 추가되지 않는 경우입니다. 내가 세로보기로 시작한다고하면 세로보기로 모든 이미지보기를 볼 수 있고 가로로 변경하면보기가 비어 있습니다. 다시 portrait로 전환하면 모든 하위 뷰 즉 imageView가 올바르게 추가됩니다. 문제는 오리엔테이션이 변경되었을 때, 새로운 nib 파일을로드하지만 코드가 이전 nob 파일에서로드 된 이전 뷰를 여전히 참조하는 경우입니다. 참조를 어떻게 바꿀 수 있습니까? 이 문제는 비동기 모드에서만 발생합니다.

디바이스 회전 후 서브 뷰 위치를 계산할 때 uiview가 문제가되지 않습니다. 이전 내 코드는

CGAffineTransform inverseTransform = CGAffineTransformInvert(self.view.transform); 
fixedPoint = CGPointApplyAffineTransform(fixedPoint,inverseTransform); 
fixedPoint = CGPointMake(fixedPoint.x+126, fixedPoint.y-109); 

이었다 그리고 나는

fixedPoint = CGPointMake(fixedPoint.x+126, fixedPoint.y-109); 

로 변경하지만 여전히 나는의 AffineTransform가 waitUntilDone 작동하지 않는 이유 우둔입니다 : NO 및 waitUntilDone에서 작동 : YES.

답변

0

전략에 약간의 문제가 있습니다. self.view이 어떻게 든 제공되며, 새로운 UIView을 새로 만들었 기 때문에 표시된 창에서 바뀌는 것은 아닙니다.

UIView (여기에서 교체 한 항목)에 컨테이너보기가 추가 된 다음 기기 방향이 변경 될 때 컨테이너보기의 콘텐츠를 변경하는 것이 좋습니다.

편집

내 대답은 분명 조금 그래서 내가 그것을 더 자세한 설명하려고하자 보일 수 있습니다. UIViewUIViewController 인 것은 UIWindow으로 표시됩니다. 창에보기에 대한 참조가 있음을 의미합니다. UIView (UIView을 새로 작성하여) UIViewController을 변경하면 이는 UIWindow에 반영된다는 의미는 아닙니다.


초기 시나리오 :

UIViewController->UIView1 < -UIWindow

새 UIView의 구축 후 :

UIViewController->UIView2
UIWindow를 -> 위의 그림에서 볼 수 있듯이 UIView1


, 당신은하지 세대 오류를 수행하지만 지금은 두 개의 뷰를 가지고 있고, 당신의 UIViewController에서 변경 한 내용이 화면에 반영되지 않습니다.

당신이 운이 좋았을지도 모르지만 그것은 처음 작동합니다. 그러나 UIWindow가 제시하기 전에 UIView을 재구성하면 모든 것이 여전히 작동하지만 여전히 나쁜 디자인이므로 쉽게 볼 수 없습니다. 타이밍이 변경된 후).

이는 일이 실제로 작동 할 수의 경우 :


초기 시나리오 :

* UIViewController->UIView1 새 UIView의 구축 후

:

을 * UIViewController->UIView2

창 화면의보기를 제시 :

UIViewController->UIView2 기본적으로 < -UIWindow


당신이 UIViewControllerUIView에 핸들을 던져해서는 안됩니다 그 후 제시되었습니다.

이 방법이 참조/포인터 작동 방식을 이해하는 데 도움이되기를 바랍니다.

+0

멋진 코더입니다. 나는 너를 도우려고 노력하고있어. 내가 당신의 디자인에 문제가되는 것을 좀 더 자세하게 설명하려고 노력하겠습니다. 휴대 전화가 기울어 질 때마다 재구성한다는 viewcontroller의보기가 있습니다. 하지만 어딘가에 UIWindow 또는 다른 뷰 컨트롤러가있는 경우에도 첫 번째 뷰에 대한 참조가 있습니다. 즉, 새보기를 구성하더라도 표시되지 않습니다. 기본적으로 : 당신은 UIViewController의 뷰를 재구성해서는 안된다. 이 부분이 조금 더 명확 해지기를 바랍니다. 또한 친절하고 친절한 분위기를 유지하십시오. – EsbenB

+0

제안 해 주신 것에 대해 감사드립니다. 문제는 자체 performSelectorOnMainThread를 사용하여 뷰를 업데이트 할 때 발생합니다. @selector (arrangeAsynchronously) withObject : nil waitUntilDone : NO]; waitUntilDone : YES 일 때 문제가 발생하지 않습니다. 즉, 문제는 뷰 프레젠테이션이 아니라 스레딩과 관련이 있습니다.그것이 의미가 있으면 알려주세요. –

+0

perform selector의 waitUntilDone YES/NO의 차이점은 코드를 실행할 때가 아니라 작업을 수행하는 스레드가 실행될 때입니다. 내가 제안한 해결책을 시도해보십시오. 도움이되지 않으면 다음 단계를 논의 할 수 있습니다. – EsbenB

관련 문제