2013-05-09 4 views
1

"마법사"와 같은 목적으로 간단한 창을 만들었습니다. (Apple 지침에 따라 기본적으로 금지되어 있음을 알고 고객을 설득하려고했지만 무엇이든)보기 위치 변경 (0,0)

그것은 두 개의 내부 사용자 정의보기하는 "이전", "다음"버튼을 포함 하단 부분에 하나, 그리고 공간의 대부분을 소요 상단에 더 큰 볼 수있는 단순한이다.

아래쪽보기 "NavigationView"와 맨 위에있는 "ContainerView"를 호출했습니다.

사용자가 이동해야하는 일련의보기를 보유 할 배열을 만들었습니다 e를 통해 "다음"및 "이전"버튼을 누릅니다.

여기 내 코드가 있습니다.

- (IBAction) next:(id)sender{ 
    currentViewIndex++; 
    [self animatePushView:YES]; 
} 

- (IBAction)previous:(id)sender{ 
    currentViewIndex--; 
    [self animatePushView:NO]; 
} 

- (void) animatePushView:(BOOL)forward{ 
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex]; 

    for (NSView *subView in [containerView subviews]) { 
     [subView removeFromSuperview]; 
    } 

    [containerView addSubview:nextView]; 
    [nextView setFrame:containerView.bounds]; 

    [containerView setNeedsDisplay:YES]; 

} 

나는 꽤 간단하다고 생각합니다. 표시 할 다음보기를 포함하는 배열이 있습니다.

어떻게됩니까? 다음보기가 ContainerView의 왼쪽 하단 부분을 중심으로 이루어집니다. 왜 이런 일이 생길까요?

또한 내가 생각하기에, 나는 꽤 오랫동안 객관적으로 일해 왔지만,보기를 관리하는 초보자입니다. 실종 된 모범 사례가 있다면 제안에 개방적이다. 감사합니다.

편집 : 이러한 뷰 중 일부는 서로 다른 크기가 , 내가보기 크기에 따라 창 크기를 변경할 수 있도록하고 싶습니다 :

내가 추가하는 것을 잊었다.

답변

0

좋아, 내가 마지막으로 ..

문제 .. 그것을 알아 냈다 .xib 파일의 컨테이너보기에 이미 표시해야하는 첫 번째보기가 이미 포함되어있었습니다.

이유를 모르겠지만 컨테이너보기의 보유 횟수에 문제가 있었던 것은 첫 번째 클릭에서 해제 되었기 때문입니다. 컨테이너 뷰를 해제하면 프레임이 null이고 뷰가 올바르게 유지되지 않아 뷰가 깜박이기 때문에 뷰의 위치가 (0,0)으로 다시 지정됩니다.

.xib 파일에서보기를 제거하고 코드를 통해 추가하면 어쨌든 제대로 작동합니다.

1

[nextView setFrame:containerView.bounds];

당신은 컨테이너보기를 할당하는 경계 다음보기 프레임 (doc)에.
현재보기 프레임을 다음보기 프레임에 할당하고 너비와 높이를 조정할 수 있습니다.

현재 표시 뷰에 대한 참조를 유지은, 이런 일이 (_currentView 유형 NSView *의 바르입니다) :

- (IBAction) next:(id)sender{ 
    currentViewIndex++; 
    [self animatePushView:YES]; 
} 

- (IBAction)previous:(id)sender{ 
    currentViewIndex--; 
    [self animatePushView:NO]; 
} 

- (void) animatePushView:(BOOL)forward{ 
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex]; 
    [nextView setFrame:_currentView.frame]; 

    [_currentView removeFromSuperview]; // _currentView is retained in the collection 
    [containerView addSubview:nextView]; 
    _currentView = nextView; 

    [containerView setNeedsDisplay:YES]; 
} 
+0

코드를 시도했는데 마치 내 것이었지만 창 왼쪽 하단의보기가 깜박입니다. 플래시가 지나면보기가 사라집니다. 내 코드에 다른 문제가있을 것 같네요. 보기가 올바르게 유지되지 않았습니까? 편집 : 보기를 보유 된 속성으로 선언했습니다. 그게 내가 한 유일한 변화이며, 지금은 이전처럼보기가 '깜박'하지만 정확한 위치에 깜박입니다. – XelharK

+0

위치 문제가보기가 올바르게 유지되지 않아보기가 저장되어 있는지 확실하지 않습니다. 컬렉션에. 뷰 프레임은 부모 좌표계로 표현됩니다. 컨테이너 뷰에 한 뷰를 올바르게 배치하면 다음 뷰에서 동일한 프레임을 쉽게 설정할 수 있습니다. 그러나 우리는 전체 코드의 일부만을 차지했습니다. 깜박이는 문제도 좋지 않습니까, 전환 할 때마다 귀하의 견해가 해제됩니까? – Vince

+0

아니, 전혀. 실제로 이러한 뷰를 사용하는 전체 코드입니다. 코드의 다른 부분에서는 참조하지 않습니다. 내가 알아 낸 또 다른 답변을 추가했는데, 아마도 보유 개수와 관련이 있습니까? – XelharK