Как получить центральное положение UIBarButtonItem

#ios #swift

#iOS #swift

Вопрос:

Я делаю некоторые пользовательские переходы контроллера представления, и я хочу, чтобы мой переход начинался с центра нажатой кнопки.

Ибо UIButton я могу сделать:

 myCustomTransition.startingPoint = buttonPressed.center
  

Но если я хочу использовать an UIBarButtonItem , как на самом деле указать, чтобы мой переход начинался с центра кнопки, потому что я не вижу никакого center свойства на UIBarButtonItem .

Есть предложения?

Комментарии:

1. вам нужно разместить кнопку в центре панели навигации, верно?

2. @vaibhav: нет, моя кнопка находится с правой стороны, мне просто нужно знать ее положение, но из того, что я читаю, нет способа получить доступ к границам UIBarButtonItem.

3. хорошо, если вы выберете, просто поместите a UIView в центр панели навигации и разверните его до конца вправо и влево, а затем перейдите к получению границ.

4. Есть ли у вас версия кода swift 3 в принятом ответе?

5. @user2722667: я только что удалил панель навигации, поэтому я больше не использую UIBarButtonItem.

Ответ №1:

Если вы просто используете UIBarButtonItem как navigationItem.leftBarButtonItem или navigationItem.rightBarButtonItem, вы не сможете напрямую получить там свойство геометрии, потому что UIBarButtonItem не наследует UIView, но в конечном итоге вы можете получить свойство геометрии, используя хитрый метод.

Это иерархия простого ViewController, у которого есть левый и правый UIBarButtonItem:

введите описание изображения здесь

UINavigationButton — ваша цель, получите его прямоугольник, и вы сможете получить в центре то, что вам нужно.

 - (void)handleItemPressed {
UIView *targetView = nil;
for (UIView *subView in self.navigationController.navigationBar.subviews) {
    if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
        for (UILabel *label in subView.subviews) {
            if ([label isKindOfClass:[UILabel class]]) {
                if ([label.text isEqualToString:"right"]) {
                    targetView = subView;
                    break;
                }
            }
        }
    }
}

CGRect rect = [targetView convertRect:targetView.frame toView:self.view];
CGPoint center_you_need = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
}
  

Если вы используете customeView, просто преобразуйте кадр customeView в точку.