使用customView创建一个UIBarButtonItem就像Flexible-Space项一样

时间:2012-01-07 22:25:20

标签: ios uibarbuttonitem uitoolbar

我的UIBarButtonItem有一个UITextField作为其customView。工具栏包含此项目和几个按钮。

当工具栏调整大小时(比如设备方向更改)我希望UITextField增大或缩小(宽度)以占用工具栏中的所有可用空间。

如果没有弄清楚工具栏中所有按钮的组合大小,然后适当地设置UITextField宽度,是否只有一些神奇的方法可以让这个项目像灵活空格条项目一样?

3 个答案:

答案 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设置为文本字段,则应自动收缩或增长。