2014-03-01 3 views
7

난 그냥 해결할 수없는 UINavigationItem의 메시지에 문제가있어 ...UINavigationItem 신속한 문제

나는 마스터와 상세 뷰 컨트롤러가 있습니다. 내가 다시 마스터 뷰 컨트롤러에 팝업 때

prompt 그러나

는, 뷰의 크기가 변경되지 않고 창 쇼 : 나는 세부 사항에 마스터에서 누르면 프롬프트가 상세 뷰 컨트롤러에 표시됩니다 을 통해 (창은 빨간색으로 된) :

window

에만 예상대로 iOS6의에 뷰의 크기를 조정, iOS7에에 발생합니다.

나는 프롬프트를 무응답 또는 viewDidDisappear으로 설정하는 등 몇 가지 시도를했지만 아무 것도 수정하지 못하는 것 같습니다.

내비게이션 컨트롤러에서 내비게이션 막대를 반투명으로 설정하면 문제가 해결되지만 불행히도 옵션이 아닙니다. 사전에 어떤 도움 https://github.com/InsertWittyName/NavigationItemPrompt

감사 :

나는이 문제를 보여줍니다 여기에 아주 작은 예제 프로젝트를 만들었습니다!

+0

iOS 버그 일 가능성이 큽니다. 7.1을 확인 했습니까? – Kevin

+0

재생 후 응용 프로그램을 일시 중지하고'po [[UIApplication sharedApplication] .keyWindow recursiveDescription]' –

+0

을 인쇄하십시오. Autolayout을 사용해 보셨습니까? –

답변

3

내가 생각할 수있는 해결책은 마스터의 UIView을 서브 클래스 화하고, viewDidMoveToSuperview을 구현하여 탐색 프레임의 높이에서 수퍼 뷰의 끝까지보기 프레임을 설정하는 것입니다. 네비게이션 바가 반투명하지 않기 때문에 레이아웃 가이드와 컨텐트 삽입을 고려하지 않아도되므로 작업이 더 쉽습니다.

몇 가지주의해야 할 점은 푸시 및 팝핑 할 때 시스템은보기 컨트롤러의보기를 애니메이션의 다른 수퍼 뷰로 이동 한 다음 탐색 컨트롤러의 개인보기 계층 구조로 반환합니다. 또한 뷰가 뷰 계층 구조 외부로 이동하면 수퍼 뷰는 nil이됩니다. 이 모든 당신의 계정에 등 가능한 도구 모음을 수행하지 않지만,

@interface LNView : UIView 

@end 

@implementation LNView 

- (void)viewDidMoveToSuperview 
{ 
    [super viewDidMoveToSuperview]; 

    if(self.superview != nil) 
    { 
     CGRect rect = self.superview.bounds; 

     rect.origin.y += 44; 
     rect.size.height -= 44; 

     [self setFrame:rect]; 
    } 
} 

@end 

는 네비게이션 바의 높이에 대한 하드 코딩 된 값을 사용하기 때문에이 완벽하게 구현되지 않습니다 : 여기에

은 예제 구현 이 뷰에 속성으로 추가 할 수 있으며 뷰 계층 구조로 들어가기 전에 viewDidLoad에 필요에 따라 매개 변수를 설정하십시오.

+0

제안 해 주셔서 감사합니다. . 나는 (didMoveToSuperview를 오버라이드 한) 이것을 시도했지만 뒤집은 후에 일관성없는 크기로 뷰를 남겼다. 어떻게하면 '보기 컨트롤러가 팝업 된 후 프롬프트 숨기기'솔루션을 시도해 볼 것을 제안 하시겠습니까? – InsertWittyName

+0

@InsertWittyName 일관성없는 크기를 설명 할 수 있습니까? 우리 프로젝트에서이 작업을 수행했는데 작동했고 탐색 표시 줄은 반투명했습니다. 내 다른 제안을 제거하고 확인했는데 프롬프트가 탐색 항목에 연결되어 있습니다. –

+0

반투명하지 않다는 뜻입니다. 보기가 크기가 조정 된 경우 올바른 크기가 아니었지만 탐색 막대 아래에있었습니다 (이보기는보기 컨트롤러보기의 맨 위에 빨간색보기를 둡니다.이보기는 모든면에서 약간 작은 픽셀이었습니다). 해결 방법을 보여주기 위해 코드를 포크하십시오. – InsertWittyName

0

당신은 스스로 답을 주셨습니다. 버그지만 반투명을 검사하면 버그를 피할 수 있습니다. 따라서 해결책은 반투명을 확인한 다음 탐색 표시 줄이 원하는 모양으로 보이도록 보정하는 것입니다.

이렇게하려면 작은 검은 색 사각형 이미지를 만들어 프로젝트에 포함 시키십시오. 탐색 막대의 배경 이미지를이 이미지로 설정하십시오. 반투명을 확인하십시오. 문제 해결됨! 탐색 표시 줄이 이제 검은 색 불투명하지만 더 이상 버그가 표시되지 않습니다.

enter image description here

+2

반복 -이 버그를 분석했습니다. 예제 프로젝트를 사용하여 Apple에 버그 보고서를 제출하십시오. – matt

+1

노력 매트를 정말 고맙게 생각하지만, 네비게이션 바를 반투명으로 설정할 수는 없으므로 후속 뷰 컨트롤러의 각 개별보기가 배치되는 방식 (예 : 네비게이션 바 아래에 있음)에 영향을 미칩니다. – InsertWittyName

+0

'edgesForExtendedLayout'의 값을 가지고 놀았지만 예상대로 작동하지 않았습니다. 이 방법으로 작업 할 수 있다면 변경 사항을 보여주십시오. – InsertWittyName

0

스위프트 버전 : 사용자가 뒤로 가기 버튼을 탭하면

class PromptViewSideEffect: UIView { 

override func didMoveToSuperview() { 
    super.didMoveToSuperview() 
    if let superview: UIView = self.superview { 
     let rect: CGRect = superview.bounds 
     rect.origin.y += 44 
     rect.size.height -= 44 
     self.frame = rect 
     } 
    } 
} 
1

당신은 당신의 탐색 바 여부를 문제가있는이

override func willMove(toParentViewController parent: UIViewController?) { 
    super.willMove(toParentViewController: parent) 
    if parent == nil { 
     navigationItem.prompt = nil 
    } 
} 
0

같은 프롬프트를 제거 할 수 있습니다 불투명하거나 반투명하다. 애플이이 가증 한 버그로 3 년 넘게 우리를 괴롭히는 것을 허락했다.

이러한 솔루션은 모두 해킹입니다. 내 해결책은 A) 절대 프롬프트를 사용하지 않거나 B) ""로 설정해야하는 경우에도 모든 단일보기에서 사용하십시오.