首页 文章

在导航栏中放置基于UIBarButtonItem的自定义视图,而不使用默认的水平填充

提问于
浏览
31

如何删除自定义左右UINavigationBar项目左侧和右侧的水平填充? iOS默认设置似乎有~10个填充点 .

我正在自定义左右导航栏按钮(我已经放弃尝试设置自己的backButtonItem,所以我只是使用leftBarButtonItem) .

在任何一种情况下(左或右),按下这些自定义按钮表示Apple似乎在leftBarButtonItem的左侧和rightBarButtonItem的右侧保留了一些填充;无论我使用UIButton的自定义背景和图像属性的宽度,我将其放置在左/右栏按钮项目内作为其自定义视图 .

由于UIBarButtonItems没有我可以访问的“框架”,我无法将它们放在超级视图中,就像我可以正常的UIViews一样 .

有关如何删除此默认填充的任何建议?请参阅附加的屏幕截图,看看我正在尝试将其缩小到零宽度 . 在屏幕截图中,加号图标显示为向右移动,因为我给了它一个插图;但突出显示的背景图像,也可能是使用插图,正在右侧修剪 .

见图片:https://skitch.com/starbaseweb/rj2e5/ios-simulator

作为参考,这是我如何创建我的自定义UIBarButtonItem(在这种情况下,它是正确的按钮):

- (UIBarButtonItem *)customAddButtonItemWithTarget:(id)target action:(SEL)action {
  UIButton *customButtonView = [UIButton buttonWithType:UIButtonTypeCustom];

    customButtonView.frame = CGRectMake(0.0f, 0.0f, 45.0f, 44.0f);

    [customButtonView setBackgroundImage:
        [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Normal.png"] 
        forState:UIControlStateNormal];
    [customButtonView setBackgroundImage:
        [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Highlighted.png"] 
        forState:UIControlStateHighlighted];

    [customButtonView setImage:
        [UIImage imageNamed:@"bgNavBarButton-Add-Normal.png"] 
        forState:UIControlStateNormal];
    [customButtonView setImage:
        [UIImage imageNamed:@"bgNavBarButton-Add-Highlighted.png"] 
        forState:UIControlStateHighlighted];

    [customButtonView addTarget:target action:action 
        forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *customButtonItem = [[[UIBarButtonItem alloc] 
        initWithCustomView:customButtonView] autorelease];
    [customButtonView setImageEdgeInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f)];

    //customButtonItem.imageInsets = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f);

    return customButtonItem;    
}

2 回答

  • 83

    55如上所述,我采用的解决方案是基于对不同但非常相关的问题的答案:How to adjust UIToolBar left and right padding . 它也可以通过(并依赖于)iOS5来实现,它允许您在左侧或右侧设置多个按钮,而不是仅设置一个按钮 .

    以下是删除自定义左按钮项左侧的填充的示例:

    UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view
    
    // Create a negative spacer to go to the left of our custom back button, 
    // and pull it right to the edge:
    UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
        initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
        target:nil action:nil];
    negativeSpacer.width = -5; 
    // Note: We use 5 above b/c that's how many pixels of padding iOS seems to add
    
    // Add the two buttons together on the left:
    self.navigationItem.leftBarButtonItems = [NSArray 
        arrayWithObjects:negativeSpacer, backButtonItem, nil];
    

    这样,导航栏中左侧栏按钮项的左侧填充就消失了!

    NOTE :这在iOS5和iOS6中对我有用 . 鉴于iOS7与公众演示有很大的不同,那些拥有iOS7早期种子的人应该测试一下如此无意的东西,比如这个黑客,实际上会继续为iOS6以外的人工作 .

  • 3

    我试过这个并且它有效:

    1)创建一个自定义的UIToolbar子类,它在-drawRect:中什么都不做,并且不是不透明的,并且有backgroundColor = [UIColor clearColor] .

    2)使用工具栏作为自定义视图创建自定义UIBarButtonItem .

    3)将您的按钮添加到自定义工具栏 .

    4)在您的自定义工具栏中覆盖-layoutSubviews并执行您自己的间距 .

相关问题