His*_*ham 11 uitoolbar uibarbuttonitem ios
确定UIToolBbar中UIBarButtonItem的x,y位置的最简单方法是什么?
我发现的唯一答案是以任何方式知道uibarbuttonitem的绘制位置.
所有提出的答案似乎都太复杂了 应该有一个更简单的方法来获得该死的UIBarButtonItem的位置不存在?
小智 18
我用过这个似乎是最优雅的方式
- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem
{
UIView *view = [buttonItem valueForKey:@"view"];
return view ? view.frame : CGRectZero;
}
Run Code Online (Sandbox Code Playgroud)
Jam*_* Hu 13
不幸的是,没有简单的方法来确定UIBarButtonItem的位置.UIBarButtonItem本质上是一个NSObject,只做两件事:描述工具栏按钮的外观,并将事件转发到指定的目标/动作选择器.
现在,假设所有按钮都是UIToolbar的子视图,并且所有按钮事件都通过它们各自的UIBarButtonItem路由,那么循环遍历UIToolbar的所有子视图并且当找到目标是UIBarButtonItem的按钮时,只需获取那个按钮的框架.一些代码:
UIToolbar *toolbar = <your toolbar>;
UIBarButtonItem *barButtonItem = <your item>;
UIButton *button = nil;
for (UIView *subview in toolbar.subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
for (id target in [(UIButton *)subview allTargets]) {
if (target == barButtonItem) {
button = (UIButton *)subview;
break;
}
}
if (button != nil) break;
}
}
CGRect frame = button.frame;
Run Code Online (Sandbox Code Playgroud)
当使用来自UIBarButtonItems的弹出框时,这适用于我.
- (void)buttonClicked:(id)sender{
{
CGRect buttonRect = [[sender view] frame];
}
Run Code Online (Sandbox Code Playgroud)
对于 iOS 11(或许更高版本)调用:
if let view = barButtonItemView.value(forKey: "view") as? UIView {
let viewFrame = view.frame
}
Run Code Online (Sandbox Code Playgroud)
将返回视图的零点原点。为了解决这个问题,请使用以下命令获取视图的窗口坐标:
let actualPointOnWindow = view.convert(view.frame.origin, to: nil)
Run Code Online (Sandbox Code Playgroud)
如果您的工具栏有任何翻译,从计算的点中减去它们以找到它在工具栏上的位置。
完整代码:
if let view = barButtonItemView.value(forKey: "view") as? UIView {
let viewFrame = view.frame
}
Run Code Online (Sandbox Code Playgroud)