Изменение позиции UIBarButtonItem в UINavigationBar

Как изменить положение UIBarButtonItem в UINavigationBar? Я бы хотел, чтобы моя кнопка была примерно на 5 пикселей выше, чем ее нормальная позиция.

Нет особого способа сделать это. Лучше всего, если вы действительно должны подclassифицировать UINavigationBar и переопределить layoutSubviews для вызова [super layoutSubviews] а затем найти и изменить положение кнопки.

Этот код создает обратную кнопку для UINavigationBar с фоном изображения и пользовательской позицией. Хитрость заключается в создании промежуточного представления и изменении его границ.

 UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *backBtnImage = [UIImage imageNamed:@"btn-back"]; UIImage *backBtnImagePressed = [UIImage imageNamed:@"btn-back-pressed"]; [backBtn setBackgroundImage:backBtnImage forState:UIControlStateNormal]; [backBtn setBackgroundImage:backBtnImagePressed forState:UIControlStateHighlighted]; [backBtn addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside]; backBtn.frame = CGRectMake(0, 0, 63, 33); UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 63, 33)]; backButtonView.bounds = CGRectOffset(backButtonView.bounds, -14, -7); [backButtonView addSubview:backBtn]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonView]; self.navigationItem.leftBarButtonItem = backButton; 

Я решил использовать преобразование и пользовательский вид:

(Swift)

  // create the button let suggestImage = UIImage(named: "tab-item-popcorn-on")!.imageWithRenderingMode(.AlwaysOriginal) let suggestButton = UIButton(frame: CGRectMake(0, 0, 40, 40)) suggestButton.setBackgroundImage(suggestImage, forState: .Normal) suggestButton.addTarget(self, action: Selector("suggesMovie:"), forControlEvents:.TouchUpInside) // here where the magic happens, you can shift it where you like suggestButton.transform = CGAffineTransformMakeTranslation(10, 0) // add the button to a container, otherwise the transform will be ignored let suggestButtonContainer = UIView(frame: suggestButton.frame) suggestButtonContainer.addSubview(suggestButton) let suggestButtonItem = UIBarButtonItem(customView: suggestButtonContainer) // add button shift to the side navigationItem.rightBarButtonItem = suggestButtonItem 

Для тех из вас, кто развивается для iOS 5, который споткнулся об этом и был обескуражен … Попробуйте что-то вроде этого:

 float my_offset_plus_or_minus = 3.0f; UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithTitle:@"title" style:UIBarButtonItemStyleDone target:someObject action:@selector(someMessage)]; [item setBackgroundVerticalPositionAdjustment:my_offset_plus_or_minus forBarMetrics:UIBarMetricsDefault]; 

Лучший способ заключается в подclassе вашего UINavigationBar, как описано здесь: https://stackoverflow.com/a/17434530/1351190

Вот мой пример:

 #define NAVIGATION_BTN_MARGIN 5 @implementation NewNavigationBar - (void)layoutSubviews { [super layoutSubviews]; UINavigationItem *navigationItem = [self topItem]; UIView *subview = [[navigationItem rightBarButtonItem] customView]; if (subview) { CGRect subviewFrame = subview.frame; subviewFrame.origin.x = self.frame.size.width - subview.frame.size.width - NAVIGATION_BTN_MARGIN; subviewFrame.origin.y = (self.frame.size.height - subview.frame.size.height) / 2; [subview setFrame:subviewFrame]; } subview = [[navigationItem leftBarButtonItem] customView]; if (subview) { CGRect subviewFrame = subview.frame; subviewFrame.origin.x = NAVIGATION_BTN_MARGIN; subviewFrame.origin.y = (self.frame.size.height - subview.frame.size.height) / 2; [subview setFrame:subviewFrame]; } } @end 

Надеюсь, поможет.

Попробуйте код ниже,

 UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleDone target:self action:nil]; [button setBackgroundVerticalPositionAdjustment:-20.0f forBarMetrics:UIBarMetricsDefault]; [[self navigationItem] setRightBarButtonItem:button]; 

Его использовали для изменения позиции «y» в этом коде. Измените значение «y» (здесь оно -20.0f) в соответствии с вашим требованием. Если значение положительное, оно будет вниз по позиции кнопки. Если значение отрицательное, оно будет содержать позицию вашей кнопки.

Мне нужно было настроить мою кнопку, чтобы повернуть направо. Вот как я это сделал, используя UIAppearance в Swift. Там есть свойство вертикальной позиции, поэтому я предполагаю, что вы можете настроить в любом направлении.

 UIBarButtonItem.appearance().setTitlePositionAdjustment(UIOffset.init(horizontal: 15, vertical: 0), forBarMetrics: UIBarMetrics.Default) 

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

Если вы просто используете изображение, а НЕ – хром по умолчанию, вы можете использовать вставки негативного изображения (установленные в инспекторе размера), чтобы перемещать изображение внутри UIBarButtonItem (удобно, потому что по умолчанию горизонтальное заполнение может привести к тому, что изображение будет дальше внутри, чем вы хотите). Вы можете использовать вставки изображения, чтобы позиционировать изображение вне границ UIBarButtonItem, а также вся окрестность левой кнопки является точной, поэтому вам не нужно беспокоиться о том, чтобы она располагалась рядом с нажмите цель. (по крайней мере, в разумных пределах).

Лучшее решение, которое я смог найти, – инициализировать UIBarButtonItem с подвью, который включает дополнительное пространство влево / вправо. Таким образом вам не придется беспокоиться о подclassификации и изменении макета других элементов внутри панели навигации, таких как заголовок.

Например, чтобы переместить кнопку 14 точек влево:

 UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, image.size.width + 14, image.size.height)]; UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(-14, 0, image.size.width, image.size.height); [button setImage:image forState:UIControlStateNormal]; [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; [containerView addSubview:button]; UIButton* button2 = [UIButton buttonWithType:UIButtonTypeCustom]; button2.frame = CGRectMake(0, 0, image.size.width + 14, image.size.height); [button2 addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; [containerView addSubview:button2]; UIBarButtonItem* item = [[[self alloc] initWithCustomView:containerView] autorelease]; 

Как сказал @Anomie, нам нужно подclassифицировать UINavigationBar и переопределить layoutSubviews() .

Это поместит все элементы правой кнопки бара, прочно прикрепленные к правой стороне панели навигации (в отличие от того, чтобы по умолчанию было слегка отрегулировано слева) :

 class AdjustedNavigationBar: UINavigationBar { override func layoutSubviews() { super.layoutSubviews() if let rightItems = topItem?.rightBarButtonItems where rightItems.count > 1 { for i in 0.. 

Единственное место, где можно установить свойство UINavigationBar UINavigationController, находится в его init (), например:

 let controllerVC = UINavigationController(navigationBarClass: AdjustedNavigationBar.self, toolbarClass: nil) controllerVC.viewControllers = [UIViewController()] 

Вторая строка задает controller корневого представления UINavigationController. (Поскольку мы не можем установить его через init(rootViewController:)

Swift 3.1

 let cancelBarButtonItem = UIBarButtonItem() cancelBarButtonItem.setBackgroundVerticalPositionAdjustment(4, for: .default) vc.navigationItem.setLeftBarButton(cancelBarButtonItem, animated: true) 
  • Swift 3
  • настраиваемая высота строки навигации
  • без заголовка

Шаг 1. Задайте позицию заголовка, используя API внешнего вида. Например, в AppDelegate’s didFinishLaunchingWithOptions

 UINavigationBar.appearance().setTitleVerticalPositionAdjustment(-7, for: .default) 

Шаг 2: Подclass UINavigationBar

 class YourNavigationBar: UINavigationBar { let YOUR_NAV_BAR_HEIGHT = 60 override func sizeThatFits(_ size: CGSize) -> CGSize { return CGSize(width: UIScreen.main.bounds.width, height: YOUR_NAV_BAR_HEIGHT) } override func layoutSubviews() { super.layoutSubviews() let navigationItem = self.topItem for subview in subviews { if subview == navigationItem?.leftBarButtonItem?.customView || subview == navigationItem?.rightBarButtonItem?.customView { subview.center = CGPoint(x: subview.center.x, y: YOUR_NAV_BAR_HEIGHT / 2) } } } } 

Вот решение Адриано с помощью Swift 3. Это единственное решение, которое сработало для меня, и я попробовал несколько.

  let suggestImage = UIImage(named: "menu.png")! let suggestButton = UIButton(frame: CGRect(x:0, y:0, width:34, height:20)) suggestButton.setBackgroundImage(suggestImage, for: .normal) suggestButton.addTarget(self, action: #selector(self.showPopover(sender:)), for:.touchUpInside) suggestButton.transform = CGAffineTransform(translationX: 0, y: -8) // add the button to a container, otherwise the transform will be ignored let suggestButtonContainer = UIView(frame: suggestButton.frame) suggestButtonContainer.addSubview(suggestButton) let suggestButtonItem = UIBarButtonItem(customView: suggestButtonContainer) // add button shift to the side navigationItem.leftBarButtonItem = suggestButtonItem 

В моем случае

  1. изменить рамку barbuttonItem для настройки пробелов

  2. Добавить, Удалить barButtonItems динамически.

  3. изменить цвет оттенка по содержимому tableviewOffset.y

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

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

Если вашей минимальной целью является iOS 11, вы можете изменить frameworks barButton в viewDidLayoutSubviews

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Change the navigationBar item frames if let customView = wishButton.customView?.superview { customView.transform = CGAffineTransform(translationX: 7.0, y: 0) } if let customView = gourmetCountButton.customView?.superview { customView.transform = CGAffineTransform(translationX: 9.0, y: 0) } } 

Но он работает только на iOS 11.

Я также попытался использовать fixedSpace. Но он не работал в нескольких элементах navigationBarButton.

  let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) space.width = -10 

Итак, я изменил ширину customView, чтобы настроить горизонтальное пространство.

Это один из classов barButtonItem

 final class DetailShareBarButtonItem: UIBarButtonItem { // MARK: - Value // MARK: Public ***// Change the width to adjust space*** let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32.0, height: 30.0)) override var tintColor: UIColor? { didSet { button.tintColor = tintColor } } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setButton() } required override init() { super.init() setButton() } // MARK: - Function // MARK: Private private func setButton() { // Button button.setImage( #imageLiteral(resourceName: "navibarIcShare02White").withRenderingMode(.alwaysTemplate), for: .normal) button.tintColor = .white button.imageEdgeInsets = UIEdgeInsetsMake(0, 1.0, 1.0, 0) button.imageView?.contentMode = .scaleAspectFill let containerView = UIView(frame: button.bounds) containerView.backgroundColor = .clear containerView.addSubview(button) customView = containerView } } 

Это результат.

Я тестировал на iOS 9 ~ 11, (Swift 4)

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

Init UIBarButtonItem с пользовательским представлением и перегрузкой layoutSubviews в пользовательском представлении, например

 -(void) layoutSubviews { [super layoutSubviews]; CGRect frame = self.frame; CGFloat offsetY = 5; frame.origin.y = (44 - frame.size.height) / 2 - offsetY; self.frame = frame; } 

Вы всегда можете выполнять настройки с помощью вставки на кнопке. Например,

 UIButton *toggleBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [toggleBtn setFrame:CGRectMake(0, 0, 20, 20)]; [toggleBtn addTarget:self action:@selector(toggleView) forControlEvents:UIControlEventTouchUpInside]; [toggleBtn setImageEdgeInsets:((IS_IPAD)? UIEdgeInsetsMake(0,-18, 0, 6) : UIEdgeInsetsMake(0, -3, 0, -3))]; UIBarButtonItem *toggleBtnItem = [[UIBarButtonItem alloc] initWithCustomView: toggleBtn]; self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:searchBtnItem, toggleBtnItem, nil]; 

Меня устраивает.

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

  UIButton *info = [UIButton buttonWithType:UIButtonTypeInfoLight]; CGRect frame = info.frame; frame.size.width += 20; info.frame = frame; myNavigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]initWithCustomView:info]autorelease]; 

Я нашел решение этой проблемы, выполнив настройку в вкладках Image Edge в пользовательской кнопке. У меня было требование в приложении увеличить высоту панели навигации, и после увеличения высоты делает проблему RightBarButtonItem и leftBarButtonItem нерегулярной.

Найдите код ниже: –

 UIImage *image = [[UIImage imageNamed:@"searchbar.png"]; UIButton* searchbutton = [UIButton buttonWithType:UIButtonTypeCustom]; [searchbutton addTarget:self action:@selector(searchBar:) forControlEvents:UIControlEventTouchUpInside]; searchbutton.frame = CGRectMake(0,0,22, 22); [searchbutton setImage:image forState:UIControlStateNormal]; [searchbutton setImageEdgeInsets:UIEdgeInsetsMake(-50, 0,50, 0)]; // Make BarButton Item UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithCustomView:searchbutton]; self.navigationItem.rightBarButtonItem = navItem; 

Надеюсь, это поможет кому угодно.

  • Регулировка громкости проигрывателя AVPlayer
  • Круговые контрольные бары в IOS
  • iPhone - UILabel, содержащий текст с несколькими шрифтами одновременно
  • Несоответствие UUID обнаружено в загруженной библиотеке
  • UIWebView не масштабирует контент для соответствия
  • Данные о сердечном ритме на яблоне
  • Как распознать салфетки во всех четырех направлениях?
  • Проверить версию iOS во время выполнения?
  • Вам нужно создать NSAutoreleasePool в блоке в GCD?
  • Лучшая производительность с помощью libxml2 или NSXMLParser на iPhone?
  • Понимание подсчета ссылок с помощью Cocoa и Objective-C
  • Interesting Posts

    Как указать вручную установленные пакеты программного обеспечения в Ubuntu?

    Как узнать, работает ли мой процесс в качестве администратора?

    Как преобразовать currentTimeMillis в формат чтения?

    Проводной беспроводной модем в Linux

    Плагин jQuery Validation: отключить проверку для указанных кнопок отправки

    Как изменить шрифт консоли Notepad ++?

    Разница между состояниями WAIT и BLOCKED

    Можно ли экспортировать GPO с одного сервера и импортировать в другой?

    Java, 3 точки в параметрах

    Клавиши «Вверх», «Вниз», «Влево» и «Вправо» не запускают событие KeyDown

    Есть ли способ взломать пароль администратора Windows в Linux (используя файл SAM) БЕЗ его сброса?

    java.security.cert.CertificateException: сертификаты не соответствуют ограничениям алгоритма

    Вложенные составные компоненты JSF, приводящие к исключению переполнения стека

    Как предотвратить множественные переполнения тоста

    Как отобразить элемент меню со значком и текстом в AppCompatActivity

    Давайте будем гением компьютера.