UIBarButtonItem высота в ландшафтном iPhone - PullRequest
9 голосов
/ 10 ноября 2010

У меня есть панель навигации в приложении для iPhone с пользовательскими элементами UIBarButtonI:

UIBarButtonItem* homePersonButton = [[UIBarButtonItem alloc]
       initWithImage:[UIImage imageNamed:@"homePerson.png"]
               style:UIBarButtonItemStylePlain
              target:self action:@selector(showHomePerson)];

Размер homePerson.png равен 20 x 18.

В портретном режиме он выглядит хорошо,но в альбомном режиме изображение 20x18 на кнопке слишком высокое, чтобы выглядеть красиво.Похоже, iOS работает над своими стандартными кнопками, чтобы уменьшить изображение по мере необходимости, когда оно находится в более тонкой навигационной панели.

Каков наилучший способ справиться с этим?

Другой примеркогда у меня есть пользовательская кнопка в titleView панели навигации.Мне нужно, чтобы оно также уменьшалось при вращении приложения.

Заранее спасибо за любые указатели, которые вы можете мне дать!

Ответы [ 3 ]

5 голосов
/ 10 ноября 2010

Размер изображения панели инструментов и панели навигации составляет 20 x 20, поэтому, когда вы предоставляете изображение, которое не соответствует этим размерам, вы оставляете до каркаса изменение размера / масштаба вашего изображения, которое вызывает вашу проблему. Измените размер / масштабируйте изображение до 20x20, и оно должно выглядеть корректно как в портретной, так и в альбомной ориентации.

3 голосов
/ 30 июля 2015

steipete упомянул об этом в комментариях, но я чувствую, что это должен быть ответ сейчас.Начиная с iOS 5, вы можете использовать инициализатор UIBarButtonItem :

- initWithImage:landscapeImagePhone:style:target:action:

Просто установите landscapeImagePhone изображение на уменьшенную версию изображения, размер которого вы хотите изменить в альбомной ориентации.

После некоторого тестирования я заметил, что iPhone сжимает панель навигации и, следовательно, элементы UIBarButtonItms на панели навигации, но iPhone 6 Plus не .Кажется, что 6 Plus поддерживает навигационную панель на высоте 44 пикселя, тогда как обычный iPhone сжимает ее до 32 пикселей.Из-за этого, 6 Plus также не использует landscapeImagePhone в альбомной ориентации.

Я проверил это, не просто используя изображение меньшего размера для landscapeImagePhone, но совершенно другоеобраз.Изображение никогда не менялось на 6 Plus.


Однако, учтите следующее с iOS 9.2 на iPhone 6 Plus:

В документации Apple для этого инициализатора указано, что landscapeImagePhone:

Изображение, которое будет использоваться для элемента в горизонтальных панелях в идиоме UIUserInterfaceIdiomPhone.

Начиная с iOS 9.2, 6 Plus отображает как UIUserInterfaceIdiomPhone как в книжной, так и в альбомной ориентации.Раньше 6 Plus был UIUserInterfaceIdiomUnspecified.Я не совсем уверен, когда это было обновлено.Но, поскольку теперь он равен UIUserInterfaceIdiomPhone, согласно документации, landscapeImagePhone должен применяться и к 6 Plus.

Так что, возможно, он не столько полагается на UIUserInterfaceIdiom, сколько наделает на высоте панель навигации.Не знаю точно.Просто отметьте, что это несоответствие может быть «исправлено» в будущем и, следовательно, может вызвать другое поведение.

0 голосов
/ 11 апреля 2012

У меня похожая проблема. Теперь я использую пользовательский тип для кнопки. например Вот мой каталог UIBarButtonItem. Вы можете использовать его для создания пользовательской панели кнопок.

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image highlightedImage:(UIImage *)highlightedImage     target:(id)target action:(SEL)action{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
    button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:button];

    return barItem;
}

Затем вы можете отрегулировать панель кнопок пользовательского вида рамки при повороте.

Совет:

  1. в методе поворота, например willAnimateRotationToInterfaceOrientation, распечатать пользовательский вид рамка кнопок панели навигации элементов .. и получите правильные кадр (в режиме Protrait), вы также можете увидеть, что кадр неверно в ландшафтном режиме, нам нужно это исправить.
  2. исправить проблему с рамкой кнопки альбомной панели, указав правильное значение кадра.

в моем случае я просто исправляю происхождение пользовательского представления ... например,

// adjust the navigation Item top, otherwise it is not proper set after rotation
_centralRootViewController.navigationItem.leftBarButtonItem.customView.top = 5;
_centralRootViewController.navigationItem.rightBarButtonItem.customView.top = 5;

Примечание: верх - это у кадра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...