你喜欢用吗私有API https://stackoverflow.com/questions/3000681/what-are-private-apis是?如果是,
UIView* view = thatItem.view;
return [view convertRect:view.bounds toView:nil];
当然,当目标瞄准 AppStore 时,没有人希望这样。 A更不可靠方法,也使用了未公开的功能,但是会通过Apple的测试,就是循环遍历子视图来寻找对应的按钮项。
NSMutableArray* buttons = [[NSMutableArray alloc] init];
for (UIControl* btn in theToolbarOrNavbar.subviews)
if ([btn isKindOfClass:[UIControl class]])
[buttons addObject:btn];
UIView* view = [buttons objectAtIndex:index];
[buttons release];
return [view convertRect:view.bounds toView:nil];
The index
是数组中您的栏项目的索引.items
, 删除所有空白项后. This assumes按钮按升序排列,但也可能不是。更可靠的方法是sort the buttons
数组在增加.origin.x
价值。当然这还是assumes栏按钮项必须继承 UIControl 类,并且是工具栏/导航栏的直接子视图,但也可能不是。
正如您所看到的,在处理未记录的功能时存在很多不确定性。但是,您只想在手指下弹出一些东西,对吗? UIBarButtonItem.action
可以是以下形式的选择器:
-(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event;
请注意event参数 - 你可以获得触摸的位置
[[event.allTouches anyObject] locationInView:theWindow]
或按钮视图
[[event.allTouches anyObject] view]
因此,无需迭代子视图或使用未记录的功能来完成您想要执行的操作。