0

UINavigationBar의 사용자 지정 하위 클래스를 사용하는 UINavigationController를 사용하려고합니다. 그러나 initWithFrame에 문제가 있습니다. initWithFrame이 호출되면 치수를 인쇄하고 0.0 너비와 0.0 높이를 보여줍니다. 그러나 UINavigationBar 하위 클래스 내부의 - (void) layoutSubviews에서 같은 프레임을 인쇄하면 프레임이 올바르게 설정됩니다. initWithFrame이 크기가 0 인 프레임을받는 이유는 무엇이며이를 해결하려면 어떻게해야합니까? 수동으로 initWithFrame 또는 그와 비슷한 것을 호출하는 것은 정확하지 않습니다. UINavigationController가이를 처리해야하기 때문입니다.initWithFrame에 빈 프레임이 지정되었습니다.

AppDelegate.m

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     NSLog(@"initWithFrame with frame: %f, %f", frame.size.width, frame.size.height); // This prints "initWithFrame with frame: 0, 0" 
    } 

    return self; 
} 

감사합니다

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    UINavigationController *navController = [[UINavigationController alloc] initWithNavigationBarClass:[CustomNavigationBar class] toolbarClass:nil]; 
    CoolViewController *vc = [[CoolViewController alloc] init]; 
    [navController pushViewController:vc animated:YES]; 
    self.window.rootViewController = navController; 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

CustomNavigationBar.m 다음은 관련 코드입니다!

+0

어떤 문제가 발생합니까? – Wain

+0

문제는 아니지만 UINavigationController에 의해 표면 상으로 호출되는 initWithFrame이 제로 x 제로 프레임을 제공받는 이유에 대해 조심스럽게 궁금해합니다. 사실 - (void) layoutSubviews에있는 UINavigationBar 하위 클래스를 초기화해야하나요? 아니면 initWithFrame에서 프레임이 잘못되도록 올바르게 설정하지 않았습니까? –

답변

1

내비게이션 컨트롤러가 실제로 프레임 크기를 지정된 값으로 설정하지 않는다고 생각합니다. 대신 탐색 표시 줄에 sizeThatFits:을 요청하고이를 사용합니다. 정의에 따르면,이를 수행 할 수 없으므로 initWithFrame:으로 전달됩니다. 따라서 sizeThatFits:, setFrame:layoutSubviews의 조합을 사용하여 탐색 모음 콘텐츠를 추가하고 크기를 조정하고 재설정하십시오.

+0

답장을 보내 주셔서 감사합니다. sizeThatFits가 존재한다는 것을 알지 못했습니다. 이 솔루션을 구현해 보겠습니다. –

+0

이 방법으로 구현하고 완벽하게 작동하는 것 같습니다. 그래도 확실히 만들기 위해 initWithFrame에서 내 탐색 막대의 사용자 지정 부분을 할당하고 초기화해야하지만 layoutSubviews의 프레임 설정은 저장해야합니까? 당신이 setFrame :이라고 말했을 때, 당신은 layoutSubviews의 내부에서 nav 막대의 프레임의 서브 뷰를 설정하는 것을 의미합니까? –

+0

필요할 경우 SetFrame을 사용하여 이미지 수정을 트리거하거나 릴레이 아웃을 강제 실행할 수 있습니다. 그러나 당신은 그것을 사용할 필요가 없습니다. – Wain

관련 문제