initWithFrame被赋予空帧

时间:2013-06-14 21:08:56

标签: ios uinavigationcontroller uinavigationbar initwithframe

我正在尝试使用UINavigationController,该UINavigationController使用UINavigationBar的自定义子类。但是,我遇到了initWithFrame的问题。当调用initWithFrame时,我打印出尺寸,它显示0.0宽度和0.0高度。但是,当我在UINavigationBar子类中的 - (void)layoutSubviews中打印出相同的帧时,框架被正确设置。为什么initWithFrame接收零大小的帧,我该怎么做才能解决这个问题?手动调用initWithFrame或类似的东西听起来不正确,因为UINavigationController应该处理它。以下是相关代码:

AppDelegate.m

- (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

- (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;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

我相信导航控制器实际上并没有将帧大小设置为指定值。相反,它会向导航栏询问其sizeThatFits:并使用它。根据定义,无法完成并传递给initWithFrame:。因此,您希望使用sizeThatFits:setFrame:layoutSubviews的组合来添加,调整大小并重置导航栏内容。