Не удается получить высоту панели UINavigationBar (пользовательский фон) с помощью UISegmentControl

#iphone #background #height #uinavigationbar #uisegmentedcontrol

#iPhone #фон #высота #панель uinavigationbar #uisegmentedcontrol

Вопрос:

Мне нужно определить высоту панели UINavigationBar

 - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    NSLog(@"NAV HEIGHT IS %d %d",self.frame.size.height, self.frame.size.width);
}
  

Выводит 0 для высоты

И пока я этим занимаюсь, почему ширина 1078329344 и 1077936128? Какие единицы измерения использует Apple?, это какой-то странный расчет на основе 326 точек на дюйм?

Фон…

Я использую метод перегрузки drawrect, чтобы добавить пользовательскую графику в панели UINavigationBar через приложение.

Все хорошо, но есть одна проблема: когда в альбомном режиме UINavigationBar имеет UISegmentControl, высота увеличивается с более короткой альбомной ориентации, чтобы соответствовать той же высоте, что и в портретном режиме.

Код может определять ширину, почему он не может определять высоту? Приведенный ниже NSLog возвращает 0

Если бы я мог сказать, какой высоты была панель UINavigationBar, я мог бы соответствующим образом поменять графику

 - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];

    NSLog(@"NAV HEIGHT IS %d %d",self.frame.size.height, self.frame.size.width);

    CGContextClip(ctx);
    CGContextTranslateCTM(ctx, 0, image.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    CGContextDrawImage(ctx, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}
  

Приведенный выше код от Ahmet Ardal (спасибо)

Ответ №1:

Вы неправильно выполняете форматирование данных. %d используется для целых чисел, но Apple использует значения с плавающей точкой для координат и размеров интерфейса. Поэтому вам нужно использовать %f для форматирования вашей строки. Попробуйте изменить на:

 NSLog(@"NAV HEIGHT IS %f %f",self.frame.size.height, self.frame.size.width);
  

Комментарии:

1. лол. Нет ничего лучше, чем совершить ошибку stoopid. Я искал формат frame.size.height, но ничего не смог найти. Вероятно, поиск был недостаточно тщательным. @PeyloW Спасибо.

2. У вас также есть удобные методы для преобразования большинства типов CoreGraphics в строки, поэтому вы могли бы сделать: NSLog(@"Nav size: %@", NSStringFromCGSize(self.frame.size)); .