Сделать UIBarButtonItem с customView, как элемент Flexible-Space

У меня есть UIBarButtonItem, который имеет UITextField как свой customView. Панель инструментов содержит этот элемент и несколько кнопок.

При изменении размеров панели инструментов (скажем, при изменении ориентации устройства) я хочу, чтобы UITextField увеличивался или уменьшался (ширина), чтобы занять все доступное пространство на панели инструментов.

Не выясняя комбинированных размеров всех кнопок на панели инструментов, а затем, соответственно, установите ширину UITextField, есть ли только какой-то волшебный способ заставить этот элемент вести себя как элемент гибкого пробела?

Ответ 1

Если вы установите UIViewAutoresizingFlexibleWidth в текстовое поле, оно должно автоматически уменьшаться или расти.

Ответ 2

Итак, как я писал в комментарии, решение, предлагаемое @Krishna_K, не работает всегда.

Поскольку я написал свой собственный метод, подумал о совместном использовании. Часть его основана на: Получить ширину UIBarButtonItem

// Expand the status label to fill remaining space
CGFloat totalItemsWidth = 0.0;
CGFloat itemsMargin     = 8.0;
for (UIBarButtonItem *barButtonItem in myToolbar.items) {
    if (barButtonItem != self.myLabelItem) {
        // Get width of bar button item (hack from other SO question)
        UIView *view = [barButtonItem valueForKey:@"view"];
        CGFloat width = view? [view frame].size.width : (CGFloat)0.0;

        totalItemsWidth += width + itemsMargin;
    }
}

self.myLabelItem.width = (myToolbar.frame.size.width - totalItemsWidth) - itemsMargin;

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

  • Невозможно объяснить, почему это работает с гибкими пространствами, но оно

  • Обратите внимание, что элементы, переданные в UIToolbar, не сохраняются, поэтому вы всегда должны работать с элементами панели непосредственно с панели инструментов, а не с локальным сохраненным объектом.

  • В этом взломе есть единственная вещь, которая работала для получения ширины (свойство try width, после некоторой задержки, с которой были добавлены представления, попытался разрешить просмотр расширений самостоятельно). Обычные взлома-предупреждения применяются...

Что он решает...

Ответ 3

У меня есть хороший подкласс UIToolbar, который я только что написал, чтобы сделать это, благодаря коду в Oded post. Он отлично работает для панели инструментов с 5 элементами: кнопкой, гибким пространством, текстовым полем, гибким пространством, кнопкой. Перевернув layoutSubviews, он может правильно отрегулировать ширину UITextField:

@implementation AdaptingTextFieldToolbar

- (void)layoutSubviews
{
    CGFloat totalItemsWidth = 0.0;
    CGFloat itemsMargin     = 8.0;
    UIBarButtonItem *textFieldBarButtonItem;
    for (UIBarButtonItem *barButtonItem in self.items) {
        // Get width of bar button item (hack from other SO question)
        UIView *view = [barButtonItem valueForKey:@"view"];
        if(view) {
            if([view isKindOfClass:[UITextField class]]) {
                textFieldBarButtonItem = barButtonItem;
            } else
            if(view.bounds.size.width > 0) {
                // Docs say width can be negative for variable size items
                totalItemsWidth += view.bounds.size.width + itemsMargin;
            }
        }
        totalItemsWidth += itemsMargin;
    }

    textFieldBarButtonItem.width = (self.bounds.size.width - totalItemsWidth) - itemsMargin;
    NSLog(@"WIDTH=%f", textFieldBarButtonItem.width);

    [super layoutSubviews];
}
@end