Compose UIBarButtonItem 在进入视图时会稍微改变位置

Posted

技术标签:

【中文标题】Compose UIBarButtonItem 在进入视图时会稍微改变位置【英文标题】:Compose UIBarButtonItem changes position slightly when coming into view 【发布时间】:2015-04-22 11:01:39 【问题描述】:

在导航栏中显示带有 UIBarButtonSystemItemCompose 按钮​​的新视图时,位置会稍微偏离并在视图进入视图后进行调整。

我认为这是 ios 中的一个错误(使用的是 8.3 版)。它仅在使用 UIBarButtonSystemItemCompose 时发生。其他类型的按钮(系统、文本或自定义)不会发生这种情况。

复制此错误所需的唯一代码是将此 ViewController 代码与将要显示的视图一起使用:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    UIBarButtonItem* composeBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera
                                      target:nil
                                      action:nil];

    [self.navigationItem setRightBarButtonItem:composeBarButtonItem animated:YES];


@end

我在 GitHub 上创建了一个存储库,使用最少的代码来重现该问题:https://github.com/jvdvleuten/iOSComposeBarButtonItemBug

看起来与此相关:UIBarButtonItems shift position when UINavigationController is presented modally,除了我的错误仅在使用 UIBarButtonSystemItemCompose 时出现。

有什么想法吗?

【问题讨论】:

ya..当您使用 compose 作为样式时,这是一个错误...但我认为您应该使用 viewDiidAppear 来处理此代码... 不,当您使用viewDidApear中的代码时,视图会在没有按钮的情况下进入视图。这不是标准的。 是的,我知道......但它现在是一个解决方案......而不是那种恼人的观点......那是更好的解决方案......或者使用 sergey Kuryanov 的答案作为解决方案 我现在正在使用撰写按钮的图像,它可以工作。我今天会试试 Sergey 的答案。 好的...这是您使用 compose 图像的最后一个选项...我知道它的工作原理和魅力 【参考方案1】:

我使用了 Sergey 的答案,但在我的按钮右侧保留了一个空白区域。我用负垫片修复了这个问题,现在效果很好:

UIBarButtonItem* composeBarButtonItem =
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose
                                              target:nil
                                              action:nil];

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
negativeSpacer.width = -6;

UIBarButtonItem *dumbBarButtonItem = [UIBarButtonItem new];

self.navigationItem.rightBarButtonItems = @[dumbBarButtonItem, negativeSpacer, self.composeBarButtonItem];

【讨论】:

嗯..我也使用了垫片,但它对我不起作用。也许是因为我只使用了垫片和原始按钮。很好的收获。 我也不知道 -6 是否合适,但“感觉”是对的 ;)【参考方案2】:

这绝对是 iOS 8.0 中的一个错误。这个“跳跃”发生在viewDidAppear 之前。这是解决此问题的方法 - 添加另一个“哑”/空项目:

UIBarButtonItem* composeBarButtonItem =
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose
                                              target:nil
                                              action:nil];
UIBarButtonItem *dumbBarButtonItem = [UIBarButtonItem new];
self.navigationItem.rightBarButtonItems = @[dumbBarButtonItem, composeBarButtonItem];

【讨论】:

我实际上在撰写按钮右侧保留了一个空白区域,并且无法通过空白视图摆脱它?【参考方案3】:

一个简单的解决方法:

let composeButton = UIBarButtonItem(image: UIImage(named: "UIButtonBarCompose"), style: .Plain, target: self, action: "compose:")
self.navigationItem.rightBarButtonItem = composeButton

我们可以使用iOS-Artwork-Extractor 获取图像“UIButtonBarCompose”。

【讨论】:

【参考方案4】:

我认为这是UIBarButtonSystemItemCompose 的问题。需要苹果开发团队的一些修正。直到苹果没有解决这个错误。您可以使用以下代码创建自定义按钮并将其设置为rightBarButtonItem

UIButton *button =  [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:[UIImage imageNamed:@"compose.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonAction:)forControlEvents:UIControlEventTouchUpInside];
    [button setFrame:CGRectMake(0, 0, 53, 31)];

    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.rightBarButtonItem = barButton;

-(void)buttonAction:(id)sender
    NSLog(@"Click");

希望对您有所帮助。

【讨论】:

愿有人反对我的回答。我认为你对同样的问题有更好的答案。请发布您的答案,然后投反对票。将来可能会对我们有所帮助。【参考方案5】:

很好的观察,这个问题在viewDidAppear 中解决了。你能检查一下吗..

- (void)viewDidAppear:(BOOL)animated    
        [super viewDidAppear:animated];

        UIBarButtonItem* composeBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil];    
        [self.navigationItem setRightBarButtonItem:composeBarButtonItem animated:YES];    

这可能对你有帮助:)

【讨论】:

这将使我的按钮动画太晚。【参考方案6】:

是的,这是 IOS8 的错误。

这是因为跳转不是导航栏项目位置,而是在撰写项目中的跳转图像位置。此项目类型似乎没有覆盖推送动画或类似的东西,例如后退按钮。

我认为您应该在雷达上创建错误并解决您当前的问题,只需创建具有相同图像的自定义 UIBarButtonItem。

【讨论】:

我只建议相关的事情,并通过花时间调查来确认错误。下次我不会这样做了。 我已向 Apple 添加了错误报告。感谢您的帮助。【参考方案7】:

动画可能会发生

试试这个。 [self.navigationItem setRightBarButtonItem:composeBarButtonItem Animation:NO];

希望有所帮助:)

【讨论】:

试过了,结果一样。

以上是关于Compose UIBarButtonItem 在进入视图时会稍微改变位置的主要内容,如果未能解决你的问题,请参考以下文章

在 KeyboardDidShow 上切换 UIBarButtonItem

在导航栏中自定义 UIBarButtonItem

如何在 Swift 中为 UIBarButtonItem 设置动作

在 Swift 中获取 UIBarButtonItem 的视图

UIBarButtonItem 在显示两次后未触发选择器

如何在Xcode + Swift 4中创建自定义UIBarButtonItem类?