iOS 7 UIBarButtonItem的间距问题很荒谬

8
我有一个问题,目前还找不到解决方法。我正在给我的应用添加新功能,并希望在我的UINavigationBar的左侧添加第二个UIBarButtonItem。出于某种原因,iOS 7将其视为button1、grandCanyon和button2。我找不到任何方法来消除这两个按钮之间荒谬的间距,这也导致我的标题不对齐。有人能帮忙吗!?是否有解决此问题的方法!?
代码:
UIBarButtonItem *firstButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"firstButton"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings)];
UIBarButtonItem *secondButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"secondButton"] style:UIBarButtonItemStylePlain target:self action:@selector(showAttachments)];
[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:firstButton, secondButton, nil]];

展示你设置按钮的代码。 - rmaddy
请将代码放在您的问题中,以便其他人可以阅读它。 - rmaddy
哎呀,完成了。我没意识到我可以编辑帖子,抱歉。 - KelticKoder
2个回答

4

我想我已经成功地解决了问题,使用了下面展示的自定义视图,虽然不完美(例如选择使按钮颜色变暗而不是变亮),但我将尝试在明天修复。很高兴我的头痛结束了!感谢您的帮助,它让我学到了一些新方法。

UIImage *firstButtonImage = [UIImage imageNamed:@"firstButton"];
firstButtonImage = [firstButtonImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

UIButton *firstButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
[firstButton setImage:firstButtonImage forState:UIControlStateNormal];
[firstButton addTarget:self action:@selector(firstButtonPressed) forControlEvents:UIControlEventTouchUpInside];

UIImage *secondButtonImage = [UIImage imageNamed:@"secondButton"];
secondButtonImage = [secondButtonImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

UIButton *secondButton = [[UIButton alloc] initWithFrame:CGRectMake(45, 0, 35, 35)];
[secondButton setImage:secondButtonImage forState:UIControlStateNormal];
[secondButton addTarget:self action:@selector(secondButtonPressed) forControlEvents:UIControlEventTouchUpInside];

UIView *leftBarItemsView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)];
[leftBarItemsView addSubview:firstButton];
[leftBarItemsView addSubview:secondButton];

UIBarButtonItem *leftBarItem = [[UIBarButtonItem alloc] initWithCustomView:leftBarItemsView];

[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObject:leftBarItem]];

1
非常感谢您。我今天遇到了同样的问题,使用了您的答案解决了它。 - Isuru
在iOS 7中,似乎也会将UIToolbar中的UIBarButtonItems展开。我已经将我的设置为按钮、标签、按钮、标签、可伸缩空间,但它显示为按钮、标签、可伸缩、按钮、标签。 - zambono

2

可能有更好的方法,但是要在iOS 7上纠正导航栏按钮项的间距问题,我已经对UINavigationBar进行了子类化,并覆盖了layoutSubviews方法。在那里,您可以将每个栏按钮项移动到任何位置。

例如:

- (void)layoutSubviews
{
    [super layoutSubviews];

    // If iOS 7, fix the bar button positions
    BOOL isIOS7 = [[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending;
    if (isIOS7)
    {
        for (UIBarButtonItem *item in self.topItem.leftBarButtonItems)
        {
            // Reposition the customView property
        }

        for (UIBarButtonItem *item in self.topItem.rightBarButtonItems)
        {
            // Reposition the customView property
        }
    }
}

实际上,在查看我的代码时,我使用了带有自定义视图的UIBarButtonItems。因此,我可以移动自定义视图的位置。

如果你只是使用像这样的带有图片的UIBarButtonItems,则可能需要循环遍历UINavigationBar的子视图以移动它们:

- (void)layoutSubviews
{
    [super layoutSubviews];

    // If iOS 7, fix the bar button positions
    BOOL isIOS7 = [[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending;
    if (isIOS7)
    {
        for (UIView *subview in self.subviews)
        {
            // Reposition as needed
        }      
    }
}

你有drawRect:方法中修改的示例吗?我不确定该如何处理。 - KelticKoder
更新了。好事您询问了,我记错了,应该是layoutSubviews方法,而不是drawRect。 - Ben Baron
我刚刚又更新了我的答案,请告诉我这是否对您有用。 - Ben Baron
我不是很擅长这个:\ 如何使用子类化的UINavigationBar?如果我尝试将其分配给导航控制器,它会告诉我它是只读属性。 - KelticKoder
我注意到如果我使用标准的系统项,间距就很好,但是当我使用自定义图像时,间距就会变得过大。也许是UIBarButtonItem处理UIImage的方式,或者是UIImage本身的问题? - KelticKoder
抱歉回复晚了,但看起来你已经找到了解决方案。如果我的回答对你有帮助,请记得点赞。另外,如果你用自己的答案解决了问题,可以选择它作为正确答案,这样问题就会被标记为已解决。 - Ben Baron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接