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
добавить, изменить размер и сбросить содержимое панели навигации.