Ответ 1
Если вы установите UIViewAutoresizingFlexibleWidth
в текстовое поле, оно должно автоматически уменьшаться или расти.
У меня есть UIBarButtonItem
, который имеет UITextField
как свой customView. Панель инструментов содержит этот элемент и несколько кнопок.
При изменении размеров панели инструментов (скажем, при изменении ориентации устройства) я хочу, чтобы UITextField
увеличивался или уменьшался (ширина), чтобы занять все доступное пространство на панели инструментов.
Не выясняя комбинированных размеров всех кнопок на панели инструментов, а затем, соответственно, установите ширину UITextField
, есть ли только какой-то волшебный способ заставить этот элемент вести себя как элемент гибкого пробела?
Если вы установите UIViewAutoresizingFlexibleWidth
в текстовое поле, оно должно автоматически уменьшаться или расти.
Итак, как я писал в комментарии, решение, предлагаемое @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, после некоторой задержки, с которой были добавлены представления, попытался разрешить просмотр расширений самостоятельно). Обычные взлома-предупреждения применяются...
Что он решает...
У меня есть хороший подкласс 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