【发布时间】:2011-02-21 13:59:11
【问题描述】:
我正在尝试获取UIBarButtonItem 的宽度。
这不起作用:
barbuttonitem.customView.frame.size.width
这也行不通:
barbuttonitem.width
【问题讨论】:
标签: iphone objective-c uibarbuttonitem
我正在尝试获取UIBarButtonItem 的宽度。
这不起作用:
barbuttonitem.customView.frame.size.width
这也行不通:
barbuttonitem.width
【问题讨论】:
标签: iphone objective-c uibarbuttonitem
这个呢:
UIBarButtonItem *item = /*...*/;
UIView *view = [item valueForKey:@"view"];
CGFloat width = view? [view frame].size.width : (CGFloat)0.0;
【讨论】:
-valueForKey: 是一个记录在案的公共方法。 KVC API 提供了一种防止直接实例变量访问的方法,因此如果该值是可访问的,则不采取任何操作来禁止访问。一个问题可能是在未来版本的 iOS 中遇到未定义的值。为了解决这个问题,您可以将调用包装在 try 块中。此外,即使您认为无法在面向 App Store 的应用中使用此方法,但这并不意味着针对越狱设备的用户无法在其应用中使用此方法。
我遇到了同样的问题。经过多次尝试,我发现了一些有效的方法!
在我的具体情况下,我需要从导航控制器的工具栏中获取第一个 UIBarButtonItem 的宽度,但您可以轻松地根据自己的喜好调整它:
UIToolbar *toolbar = self.navigationController.toolbar; // or whatever toolbar you need
UIView *view = (UIView *)[toolbar.subviews objectAtIndex:0]; // 0 for the first item
double itemWidth = view.bounds.size.width;
请注意:我必须在 viewDidLoad 中使用此代码才能获得正确的值。在初始化中它返回 0.0
亚瑟
【讨论】:
如果您对某个特定项目的宽度感兴趣,最简单的方法是拥有两个 IBOutlet:一个用于按钮,另一个用于相应的条形按钮项目。您将读取按钮宽度,而不是读取条形按钮项的宽度。
当然,如果您愿意,这种方法将行不通,例如对循环中的宽度求和。 (顺便说一句,第一个按钮从 x=12 开始,两个按钮之间的距离是 10,除非你做一些棘手的事情。)当然,你可以有两个数组,但这只是很麻烦。
【讨论】:
工具栏中总是有多个子视图。
除了 arthurs 的答案,您还可以遍历它们并检查它的类型。
for sv in self.navigationController!.toolbar.subviews {
if sv.isKindOfClass(UIBarButtonItem.self){
let width = sv.bounds.width
}
}
【讨论】:
直接获取条形按钮项的宽度。
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"image"] style:UIBarButtonItemStylePlain target:self action:@selector(action:)];
double width = barButtonSetting.image.size.width;
【讨论】: