UIBarButtonItem
не расширяется UIView
, таким образом, нет ничего как свойство кадра.
Но есть ли любой способ, которым я могу получить то, что, это CGRect
кадр, относительно приложения UIWindow
?
Нравится ли вам использовать частные API ? Если да,
UIView* view = thatItem.view;
return [view convertRect:view.bounds toView:nil];
Конечно, никто не хочет этого при нацеливании на AppStore. более ненадежный метод , также использующий недокументированные функции, но прошедший тест 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];
Индекс
- это индекс элемента панели в массиве .items
, после удаления всех пустых элементов . Это предполагает , что кнопки расположены в порядке возрастания, что может и не быть. Более надежный метод - отсортировать массив кнопок
по возрастанию значения .origin.x
.Конечно, это по-прежнему предполагает , что элемент кнопки панели должен наследовать класс UIControl и является прямым подвидом панели инструментов / панели навигации, что, опять же, может не быть.
Как видите, при работе с недокументированными функциями возникает большая неопределенность. Однако вы просто хотите, чтобы что-то всплыло под пальцем, верно? .action
UIBarButtonItem может быть селектором формы:
-(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event;
обратите внимание на аргумент event - вы можете получить позицию касания с помощью
[[event.allTouches anyObject] locationInView:theWindow]
или вид кнопки с помощью
[[event.allTouches anyObject] view]
Следовательно, нет необходимости перебирать подпредставления или использовать недокументированные функции для того, что вы хотите сделать.
Вы можете получить его из представления UINavigationBar. NavigationBar - это UIView, который имеет 2 или 3 пользовательских подпредставления для частей на панели.
Если вы знаете, что UIBarButtonItem в настоящее время отображается на панели навигации справа, вы можете получить его фрейм из массива subviews панели навигации.
Сначала вам понадобится navigationBar , которую можно получить из navigationController , которую можно получить из UIViewController. Затем найдите самое правое подпредставление:
UINavigationBar* navbar = curViewController.navigationController.navigationBar;
UIView* rightView = nil;
for (UIView* v in navbar.subviews) {
if (rightView==nil) {
rightView = v;
} else if (v.frame.origin.x > rightView.frame.origin.x) {
rightView = v; // this view is further right
}
}
// at this point rightView contains the right most subview of the navbar
Я не скомпилировал этот код, поэтому YMMV.