iOS:转换时 LeftBarButtonItem 上的奇怪叠加

Posted

技术标签:

【中文标题】iOS:转换时 LeftBarButtonItem 上的奇怪叠加【英文标题】:iOS: Weird overlay on LeftBarButtonItem on Transition 【发布时间】:2018-06-29 13:46:20 【问题描述】:

我在使用objective-cios 项目中使用导航栏时遇到了一点问题。

我有一些由navigationviewcontroller 管理的视图控制器,其层次结构类似于 1-2-3。

对于Viewcontrollers 2 和3,我在viewWillAppear 函数中定义了自定义后退按钮,因为我需要在触摸它们时为其分配更复杂的逻辑。这就是我在前一个视图控制器中没有设置后退按钮的原因。

一切都像这样正常工作,我的唯一问题是,在从一个视图转换到另一个视图时,后退按钮的箭头被导航栏背景颜色颜色的小视图覆盖,直到高达 50%,然后在过渡完成后消失。

我用这个函数在导航栏中创建我的后退按钮,在viewWillAppear中调用:

- (void)setupCustomBackButton:(NSString *)title
                   action:(SEL)action
              buttonFrame:(CGRect)buttonFrame 

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
backButton.frame = buttonFrame;
[backButton setImage:[UIImage imageNamed:@"backArrowOwn"] forState:UIControlStateNormal];
backButton.imageEdgeInsets = UIEdgeInsetsMake(0.0f, -8.0f, 0.0f, 0.0f);
[backButton setTitle:title forState:UIControlStateNormal];
[backButton.titleLabel setFont:[UIFont systemFontOfSize:17.0]];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0.0f, -3.0f, 0.0f, 0.0f);
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[backButton addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = barButton;

我希望也许有人对我有一个好的提示!谢谢!

【问题讨论】:

【参考方案1】:

尝试将自定义按钮初始化移动到 viewDidLoad 方法中。

【讨论】:

我已经尝试过了,但不幸的是它没有帮助。另外,例如,我在 iOS 10 上没有这些问题...【参考方案2】:

经过长时间的尝试,我终于设法自己解决了这个问题。 所以基本上,当我创建一个 leftBarButton 时,按钮不会从左边距开始,但左边距有一些空间。当我现在用负插图插入我的按钮图像时,图像将基本上在我的按钮框架之外。然后这部分奇怪地覆盖在过渡上。

为了解决这个问题,我只需将另一个 UIBarButtonItem 添加到我的 leftBarButtonItems。这似乎为我解决了这个问题,虽然我真的不知道为什么。 另外,我认为导航栏中的 leftBarButton 并不完全从边距开始,而是在边距有一个空间,我必须插入我的图像才能获得与图像完全相同的位置,这很奇怪,因为默认后退按钮有。

我用于创建自定义后退按钮的新代码现在如下所示:

- (void)setupCustomBackButton:(NSString *)title
                   action:(SEL)action
              buttonFrame:(CGRect)buttonFrame 

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
backButton.frame = buttonFrame;
[backButton setImage:[UIImage imageNamed:@"customBackArrow"] forState:UIControlStateNormal];
backButton.imageEdgeInsets = UIEdgeInsetsMake(0.0f, -8.0f, 0.0f, 0.0f);
[backButton setTitle:title forState:UIControlStateNormal];
[backButton.titleLabel setFont:[UIFont systemFontOfSize:17.0]];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0.0f, -3.0f, 0.0f, 0.0f);
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[backButton addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                   initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                   target:nil action:nil];

self.navigationItem.leftBarButtonItem = nil;
[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer,barButton, nil] animated:NO];

谢谢大家,希望我的回答也能对其他人有所帮助!

【讨论】:

以上是关于iOS:转换时 LeftBarButtonItem 上的奇怪叠加的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 leftBarButtonItem 在 iOS 11.4 上变得更小

[iOS类别的使用]---导航栏leftBarButtonItem图标修改

iOS 11 在 leftBarButtonItem 旁边的导航栏中显示 searchBar

iOS11导航栏leftBarButtonItem显示失常

设置leftBarButtonItem后如何在UINavigationController中启用后退/左滑手势?

我的自定义 UIButton 不能用于替换 leftBarButtonItem