Объясните эту логику полей для leftBarButtonItem, rightBarButtonItem, titleView - PullRequest
5 голосов
/ 28 мая 2011

Может кто-нибудь объяснить мне, откуда появляются поля, которые вы видите на снимке экрана ниже?Я хочу, чтобы красный, зеленый и синий прямоугольники были расположены рядом друг с другом как в макетах экрана, так и в альбомной и портретной ориентации.Вместо этого я вижу необъяснимые поля между взглядами.

// Setup Left Bar Button item
UIBlankToolbar* tools = [[[UIBlankToolbar alloc] initWithFrame:CGRectMake(0, 0, 115, 44)] autorelease];
tools.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[tools setBackgroundColor:[UIColor greenColor]];
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease];

...

// Setup Right Bar Button Item
UIBlankToolbar* tools = [[[UIBlankToolbar alloc] initWithFrame:CGRectMake(0, 0, 100, 44)] autorelease];
[tools setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[tools setBackgroundColor:[UIColor redColor]];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease];

...

// Setup Title View
self.navigationItem.titleView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 44)] autorelease];
self.navigationItem.titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.navigationItem.titleView setBackgroundColor:[UIColor blueColor]];

То, что я вижу с этим кодом:

enter image description here enter image description here

Что меня действительно смущает, так это то, что поля между представлениями становятся БОЛЬШЕ, поскольку доступное пространствостановится меньше?Я не понимаю, почему они там, и почему они ведут себя не так, как я ожидаю от полей.

Спасибо!

1 Ответ

4 голосов
/ 29 мая 2011

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

Объяснить ваш конкретный код тоже не сложно: 115+100+50 = 265 и ширинаэкрана 320, поэтому панель навигации имеет 55 пикселей для использования в качестве полей.Левый элемент выровнен по левому краю, правый элемент выровнен по правому краю, а средний элемент - по центру.Таким образом, поля, которые вы получаете в портрете, имеют смысл.

То, что вы видите в ландшафте, обусловлено вашей гибкой шириной.У вас не должно быть гибкой ширины для элементов на панели навигации, поэтому поведение при этом не определено, т. Е. Ошибка в том, как вы используете панель навигации, а не в самой панели навигации.

То, что происходит, - то, что новый размер для правильного пункта вычислен сначала.Вырастает от 100 до 100+(480-320) = 260.Затем вычисляется размер среднего элемента, и кажется, что он просто берет все доступные ему размеры.Когда пришло время вычислить левый элемент, он фактически сжимается, поскольку правый и средний элемент заняли все пространство, поэтому, когда на панели навигации устанавливаются поля, пиксели берутся из левого элемента.

ФактическийАлгоритм может отличаться.В конце концов, это закрытый исходный код, и я пытаюсь объяснить неопределенное поведение, но, глядя на производимые поля, которые, кажется, и происходят.

В любом случае, ваше приложение никогда не должно полагаться на неопределенное поведение, как неопределенное поведение.может меняться между версиями и сломать его.Что вы должны сделать, это создать свой собственный вид и добавить его в качестве подпредставления панели навигации.Тогда вы будете обрабатывать поля в своем представлении так, как вы хотите.

yourView = [[YourView alloc] initWithFrame:(UIInterfaceOrientationIsPortrait(interfaceOrientation)) ? CGRectMake(0, 0, 320, 44) : CGRectMake(0, 0, 480, 44)];
yourView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.navigationController.navigationBar addSubview:yourView];
...