initWithFrame задан пустой кадр

Я пытаюсь использовать UINavigationController, который использует пользовательский подкласс UINavigationBar. Тем не менее, я столкнулся с проблемой с initWithFrame. Когда вызывается initWithFrame, я распечатываю размеры, и они показывают ширину 0,0 и высоту 0,0. Но когда я распечатываю тот же кадр в -(void) layoutSubviews внутри подкласса UINavigationBar, кадр устанавливается правильно. Почему 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 ответ

Решение

Я считаю, что контроллер навигации на самом деле не устанавливает размер кадра в указанное значение. Вместо этого он запрашивает панель навигации для его sizeThatFits: и использует это. По определению это не может быть сделано и передано initWithFrame:, Итак, вы хотите использовать комбинацию sizeThatFits:, setFrame: а также layoutSubviews добавить, изменить размер и сбросить содержимое панели навигации.

Другие вопросы по тегам