2010-01-27 5 views
10

일부 응용 프로그램 디자인이나 navigateController의 pushViewController를 따르는 일부 UIView의 경우 새 뷰가 상태 표시 줄의 높이만큼 창 밖으로 이동합니다. 결과적으로이 코드 스텁을 viewDidLoad 메서드에 넣을 것입니다.탐색 후에 일부 UIView가 어떻게 바뀌나요?

CGRect frameAt = [self.view frame]; 
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
frameAt.origin.y += statusBarFrame.size.height; 
[self.view setFrame: frameAt]; 

이것이 엑스 코드와 인터페이스 빌더의 의도라고 나에게 이해가되지 않습니다, 그래서 내가 내보기 디자인 중에 SDK와 근본적으로 잘못된 일을하고 있다고 생각한다. 또한 드문 경우지만 내 견해를 바꿀 필요는 없지만 두 디자인 접근 방식의 차이점을 실제로 알지 못합니다.

또한 대부분의 경우 약간의 사소한 사용자 지정을 사용하여 IB를 사용하여 내보기를 디자인하려고합니다.

다른 사람이이 코드 스텁없이 고칠 수있는 일을 알고 있습니까?

+0

또한 '시뮬레이트 된 상태'설정을 사용하고 적어도 한 번은 올바른 조정을 한 것처럼 보였으므로 코드를 변경하지 않아도됩니다. – mobibob

답변

16

.

아래 applicationDidFinishLaunching

는 원래 다음과 같이 구현됩니다

[window addSubview:navigationController.view]; 
[window makeKeyAndVisible]; 

나는이로 변경하는 경우 :

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil]; 
[shellController.view addSubview:navigationController.view]; 
[window addSubview:shellController.view]; 
[window makeKeyAndVisible]; 

는 그럼 난 나타나는 격차를 얻을.

그러나 나는 단지이 작업을 수행 할 경우 :

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
[shell addSubview:navigationController.view]; 
[window addSubview:shell]; 
[window makeKeyAndVisible]; 

그런 다음 모든 것이 정상 보이는

.

그래서 모든 뷰 컨트롤러는 루트보기 컨트롤러 인 경우 해당보기를 오프셋합니다. 하지만 네비게이션 컨트롤러는 루트 뷰 컨트롤러인지 여부에 관계없이이 동작을 재정의하여 뷰를 오프셋합니다. 따라서 당신은 네비게이션 컨트롤러가 있어야하는 것보다 계층 구조에서 더 낮은 위치에 있기 때문에 그 차이가 나타나고 있다고 말할 수 있습니다.

+0

나는 당신이 문제에 있다고 생각합니다. 이 문제가있는 두 개의 화면이있는 다른 앱을 확인하겠습니다. 그 UIViewControllers UINavigationController 추가 할 수 있습니다 생각합니다. 약 20 분 후에 ... – mobibob

+0

수수께끼가 풀렸다! 그게 다야 !!! 나는이 일에 열심히 일해 주셔서 정말로 감사드립니다. 기존 UIViewController에 탐색 막대를 추가하는 것은 정말 좋은 원칙을 배웠습니다.내가 가진 방식대로 그들은 "UIView 계층 구조에서 더 낮게"정의되었습니다. IBOutlet을 코드에 추가하고 IB로 인스턴스화 한 다음 IB의 Nav 컨트롤러를 코드에서 뽑았을 때 원하는 탐색 기능과 볼 수있는 인공물을 모두 얻을 수있었습니다. 게다가, 프레임을 세우는 것은 방해가되는 '도약'을 제자리로 되돌려 놓았습니다. 이것은 내 문제의 정답의 110 %입니다. – mobibob

+0

3 월 10 일에 응답이 있음을 확인했습니다. 이것이 iOS6과 호환되는지 확실하지 않습니다. 비슷한 문제가 있지만 탐색 간격 아래에 있습니다. 여기에 내 질문입니다 : http://stackoverflow.com/questions/17790946/ios-containerview-with-modalview-gap-appears-after-dismissing-modal 감사. – user1107173

2

여기서 유의해야 할 점은보기 컨트롤러가보기 자체의 프레임을 설정한다는 것입니다. 이는 앱의 사용 기간 동안보기에 사용할 수있는 공간이 변경 될 수 있고보기 컨트롤러 만보기의 프레임을 적절하게 조정하는 방법을 알고 있기 때문입니다. 공간이 변경되는 경우의 예는 높이를 변경하는 탐색 모음을 포함하여 세로에서 가로로 장치를 돌리거나 사용자가 전화를 걸면 상태 표시 줄의 높이가 높아질 수 있습니다. 이 때문에 직접 뷰의 프레임을 수정해서는 안됩니다.

그래서 가장 먼저해야 할 일은보기의 프레임을 수정하는 것과 관련된 모든 코드를 제거하는 것입니다.

이제 프레임 크기가 언제든지 바뀔 수 있다는 사고 방식으로보기를 디자인해야합니다. 이것은 각 하위 뷰의 자동 크기 조정 속성을 올바르게 설정하는 것을 의미합니다. 이렇게하면 시뮬레이트 된 탐색 및 상태 표시 줄을 켜거나 끌지 여부는 중요하지 않습니다. 대부분의 경우 최종 결과가 어떻게 보이는지 알 수 있도록 도와줍니다.

크기 검사기 (눈금자 아이콘이있는 이미지)의 인터페이스 작성기에서 각 하위 뷰의 자동 크기 조정 속성을 설정할 수 있습니다. 애니메이션에서 흰색 상자는보기 컨트롤러의 루트보기를 나타내고 빨간색 상자는 현재 선택된 하위보기를 나타냅니다. 기본적으로 하위보기는 루트보기의 왼쪽 상단에 고정되어 있습니다. 뷰의 크기가 절대로 바뀌지 않는다면 괜찮습니다.하지만 사실이 아님을 알고 있습니다. 아무 문제없이 하단에 표시하려는 하위보기가있는 경우 왼쪽 다이어그램으로 재생해야합니다. 그것이 작동하는 방식은 가장자리 주변의 4 개의 선 중 하나가 선택되면 루트보기의 가장자리와 하위보기의 가장자리 사이의 거리가 고정됩니다. 하위 뷰를 아래쪽에 표시하려면 맨 아래 줄이 선택되고 맨 위가 아닌지 확인해야합니다. 가운데 두 줄은 루트보기가 크기를 변경할 때 하위보기의 크기가 변경되는지 여부에 영향을줍니다. 예를 들어, 화면의 전체 높이를 차지하려는 테이블 뷰가있는 경우 내부 수직선이 선택되었는지 확인해야합니다. 이것은 스트럿츠 및 스프링 모델이라고합니다.

프로그래밍 방식으로 하위보기를 추가하는 경우 각 하위보기에서 autoresizingMask 속성을 설정해야합니다. Here's an explanation.

희망 하시겠습니까?

+0

안녕 Moshy, 나는 당신이 내가 믿는 것을 확인했다. (시스템이 화면과 프레임을 관리하게). 불행히도, 시간이 지남에 따라 코딩의 일부가 무언가를 조정하고 프레임이 이동합니다.일반적으로 멀리 탐색 한 다음 돌아올 때 서브 클래 싱 된 뷰 컨트롤러의 뷰입니다. 나는 내 이해가 맞았고 내 진짜 질문은 - 내가 어떻게 내 계층 구조를 조정했는지 그리고 어떤 근본적인 매개 변수/설정을 고쳐야하는지 결정할 수 있어야한다고 생각한다. 나는 또한 참조 된 문서를 (여러 번) 읽었다. 나는 이것이 대답이라고 결정하기 전에 좀 더 검토 할 것입니다. – mobibob

+0

Moshy, Brian의 질문과 응답자를 읽었습니다. 그들 중 몇몇은 자신이 만든 프레임을 프레임 크기로 설정해야한다는 것을 알게되었습니다. 오리 엔테이션 탐지 또는 근본적인 무언가의 크기 경쟁 조건과 비슷합니다. 내 하위 뷰의 자동 크기 조정을 확인하고 작동하는 경우, 나는 당신에게 대답을 수여 할 것입니다. – mobibob

+0

흠, 뷰 컨트롤러 구조를 게시하면 도움이 될 수 있습니다. 문서에서는 다음을 지정합니다. 탐색 인터페이스를 배포 할 때 만들려는 뷰 계층 구조의 루트로이보기를 설치해야합니다. 예를 들어 탐색 인터페이스를 단독으로 배포하는 경우이보기를 윈도우의 기본 하위보기로 만듭니다. 탭 인터페이스에 탐색 인터페이스를 설치하려면 탐색 탭의보기를 해당 탭의 루트보기로 설치하십시오. – jamesmoschou

1

비슷한 문제가 발생했습니다.내 앞의 두 질문에 체크 아웃 : 나는 시도하고이 문제를 재현하는 Apple's NavBar sample code을 사용했습니다

IPhone - After dismissing Modal View Controller - gap is left at top of page

IPhone - UIView addSubview Gap at top

+0

안녕하세요 브라이언, 내가 Moshy (위)에 대한 내 의견에서 언급했듯이, 나는 내 질문에 답하기 전에 조사한 것으로 생각되는 Q & A를 검토했으며 유망한 것처럼 보였지만 문제는 해결하지 못했습니다. 게다가, 나는 그 자체가 현재의 환경에 프레임을 설정하는 것이 잘못된 해결책으로 생각한다. 아직 대답하지 않은 상태로 둘 것입니다. (내 앱 중 하나의 문제에 대해 답변했지만 다른 앱의 해결책이라고 생각하지 않습니다.) – mobibob

+0

좋은 것들 -이 반응은 문제에 대한 나의 연구 개발에 도움이되었고 SDK에 대한 더 깊은 통찰력을 제공했지만, Moshy의 대답은 직접 내 문제를 해결하고 약간의 부작용이있었습니다. 이전 문제를 다시 방문하여 이것이 더 나은 해결책인지 확인하는 것이 좋습니다. - 진심으로 감사드립니다. – mobibob

0

link text

는 유사한 버그는 여기에 설명되어 있습니다.

애니메이션도 아니오로 설정되어 있습니까? 이것이 내가 직면했던 유사한 문제를 해결 했으므로 YES로 설정해보십시오.

0

UIView 요소의 크기 조정 속성을 제어하기 위해 IB에서 점선/실선의 의미를 깨달은 Moshy의 대답은 매우 유용했습니다.

그러나 이러한 속성을 조정해도 내 견해 중 하나에서 직면 한 유사한 문제는 해결되지 않았습니다. 이보기에는 IB에 정의 된 상태 및 위쪽 표시 줄이 있습니다. 그것은 다소 무거운 것이었고 은 viewWillAppear 안에 HTML 문자열을로드하는 UIWebView와 몇 가지 다른 인터페이스 요소를 포함합니다.

보기를로드하는 동안 사용자가 갑자기 장치의 방향을 세로에서 가로로 변경하면보기의 모든 내용이 상태 막대의 높이만큼 아래쪽으로 이동합니다. 뷰 컨트롤과 그 윗면의 결과적인 차이는 세로 방향으로 다시 전환 한 후에도 유지됩니다. 결국 내 문제를 해결 무엇

, 내 나머지 머리는 줄을 추가했다 :

self.view.frame = [[UIScreen mainScreen] bounds]; 

내보기 내용이 갑작스러운 장치 방향 변경에도 불구하고 자리에 개최 이래

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

내.