Выяснить кадр UIBarButtonItem в окне?

UIBarButtonItem не расширяется UIView, таким образом, нет ничего как свойство кадра.

Но есть ли любой способ, которым я могу получить то, что, это CGRect кадр, относительно приложения UIWindow?

64
задан leolobato 8 June 2010 в 02:05
поделиться

2 ответа

Нравится ли вам использовать частные 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]

Следовательно, нет необходимости перебирать подпредставления или использовать недокументированные функции для того, что вы хотите сделать.

126
ответ дан 24 November 2019 в 15:44
поделиться

Вы можете получить его из представления 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.

1
ответ дан 24 November 2019 в 15:44
поделиться