#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 в точку.