在UINavigationBar中更改UIBarButtonItem的位置

Ben*_*ams 64 iphone objective-c uinavigationbar uibarbuttonitem

如何在UINavigationBar中更改UIBarButtonItem的位置?我希望我的按钮比正常位置高5px.

Evg*_*nev 119

此代码为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;
Run Code Online (Sandbox Code Playgroud)

  • 但是,这个问题是可以分接的区域仍然限制在默认的UIBarButtonItem区域.移动UIButton可能会导致可以轻敲的区域变小,因此有时候看起来好像UIButton无法识别水龙头. (31认同)
  • 为UIButton设置偏移量(通过"CGRectOffset")在iOS7中不起作用.UIBarButtonItem似乎在iOS7中具有固定位置并且移动/偏移x,UIButton的y坐标不起作用.修改UIButton的宽度和高度有效但不影响更改x,y坐标. (3认同)

Adr*_*oni 39

我解决了使用转换和自定义视图:

(迅速)

  // 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
Run Code Online (Sandbox Code Playgroud)


Ano*_*mie 34

没有特别好的方法来做到这一点.你最好的选择是你必须是UINavigationBar的子类,并覆盖layoutSubviews调用[super layoutSubviews]然后找到并重新定位按钮的视图.

  • 没有人知道使用外观方法吗?把它放在你的app委托中:`[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class],nil] setBackButtonBackgroundVerticalPositionAdjustment:-3 forBarMetrics:UIBarMetricsDefault]; ` (13认同)
  • 你是怎么让它停止跳跃的?我有同样的问题 (8认同)
  • 感谢您分享这一点.你能提供样品吗?先感谢您. (3认同)
  • 实际上,我把它拿回来了.它工作得很好.跳跃是我的错误.谢谢! (2认同)

小智 17

对于那些为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];
Run Code Online (Sandbox Code Playgroud)


Sim*_*Lai 12

最好的方法是将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
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


Aug*_*P A 6

试试下面的代码,

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleDone target:self action:nil];
[button setBackgroundVerticalPositionAdjustment:-20.0f forBarMetrics:UIBarMetricsDefault];
[[self navigationItem] setRightBarButtonItem:button];
Run Code Online (Sandbox Code Playgroud)

它用于更改此代码中的"y"位置.根据您的要求更改"y"值(此处为-20.0f).如果值为正,则按下按钮位置.如果值为负,则会提升按钮位置.


Mar*_*ges 6

我需要将我的按钮设置为向右移动.这是我在Swift中使用UIAppearance的方法.那里还有垂直位置属性,所以我想你可以向任何方向调整.

UIBarButtonItem.appearance().setTitlePositionAdjustment(UIOffset.init(horizontal: 15, vertical: 0), forBarMetrics: UIBarMetrics.Default)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎比直接搞乱框架或添加自定义子视图更具侵略性.

  • 这仅适用于我认为的标题文本.不是酒吧按钮项目. (2认同)

小智 5

使用更改左栏位置和图像边缘插入的导航栏

迅捷4

let leftBarButtonItem = UIBarButtonItem.init(image: UIImage(named:"ic_nav-bar_back.png"), landscapeImagePhone: nil, style: .plain, target: viewController, action: #selector(viewController.buttonClick(_:)))
            leftBarButtonItem.imageInsets = UIEdgeInsets(top: 0, left: -15, bottom: 0, right: 0)
            leftBarButtonItem.tintColor = UIColor(hex: 0xED6E19)
            viewController.navigationItem.setLeftBarButton(leftBarButtonItem, animated: true)
Run Code Online (Sandbox Code Playgroud)