UIBarButtonItem不扩展UIView,所以没有什么比框架属性更好的了.

但是有什么方法可以得到相对于应用程序UIWindowCGRect帧吗?

推荐答案

你喜欢用private API吗?如果是,

UIView* view = thatItem.view;
return [view convertRect:view.bounds toView:nil];

当然,在瞄准应用store 时,没有人想要这个.一个more unreliable的方法,也使用了未记录的功能,但将通过苹果的测试,就是在子视图中循环寻找相应的按钮项.

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];

index.itemsafter removing all blank items数组中的条目的索引.这意味着按钮按递增的顺序排列,这可能不正确.一种更可靠的方法是在增加.origin.x值的情况下对buttons数组进行调整.当然,这仍然意味着工具栏按钮项目必须继承UIControl类,并且是工具栏/导航栏的直接子视图,这也可能不是.


正如您所看到的,在处理未记录的功能时存在很多不确定性.然而,你只是想在手指下弹出一些东西,对吗?uibarbuttoneim's .action可以 Select 以下形式:

-(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event;

请注意event参数-您可以获得touch 的位置

[[event.allTouches anyObject] locationInView:theWindow]

或者使用

[[event.allTouches anyObject] view]

因此,不需要迭代子视图,也不需要使用未记录的特性来完成您想要做的事情.

Objective-c相关问答推荐

如何使用 iOS 7 SpriteKit 粒子向非游戏的 iOS 应用程序添加粒子效果?

如何判断 iPhone 现在在哪个位置(横向或纵向)?

uipageviewcontroller 类在设置多个视图控制器时崩溃

在从 UIViewController 调用的非保留完成中引用 self 时,weakSelf/strongSelf 舞蹈真的有必要吗?

目标 C:在不离开应用程序的情况下发送Electron邮件

将长按手势和拖动手势结合在一起

在 UILabel.attributedText *not* 蓝色和 *not* 下划线

在Objective C中迭代枚举?

仅替换 NSString 中子字符串的第一个实例

适用于 ios 的 360° 全景库

setStatusBarHidden 在 iOS 9.0 中已弃用

UITableView - Select 了哪一行?

iPhone - 时区便利方法之间的差异

如何在 ios 8 的 alertview 中添加文本输入?

自定义导航栏样式 - iOS

以编程方式设置 UIView 的自动调整大小掩码?

AVAudioPlayer 不播放任何声音

Xcode 的不完整实现警告

Xcode中私有方法的单元测试

Xcode 在调试时判断表达式