我的UIBarButtonItem
有一个UITextField
作为其customView。工具栏包含此项目和几个按钮。
当工具栏调整大小时(比如设备方向更改)我希望UITextField
增大或缩小(宽度)以占用工具栏中的所有可用空间。
如果没有弄清楚工具栏中所有按钮的组合大小,然后适当地设置UITextField
宽度,是否只有一些神奇的方法可以让这个项目像灵活空格条项目一样?
答案 0 :(得分:7)
正如我在评论中所写,@ Krishna_K建议的解决方案始终不起作用。
因为我写了自己的方法,想到分享。 其中一部分基于: Get the width of a 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的项目是复制而不是保留 - 因此您应始终处理工具栏本身的条形项目,而不是本地保留的对象
那里的黑客是唯一能够获得宽度的东西(尝试过宽度属性,经过一段时间的延迟尝试添加视图,尝试让视图自行扩展)。通常的黑客警告适用......
那就是人们......
答案 1 :(得分:3)
我有一个很好的UIToolbar
子类我刚刚写过这样做,感谢Oded的帖子中的代码。它适用于包含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
答案 2 :(得分:2)
如果您将UIViewAutoresizingFlexibleWidth
设置为文本字段,则应自动收缩或增长。