IOS11でUINavigationBar
のバグを見つけました。viewDidLoadでself.navigationItem.rightBarButtonItems = @[fixSpaceItem, item]
を使用してナビゲーションアイテムボタンを最初に設定します。ジェスチャポップバックを使用しますが、実際にはポップバックしません。ポップバックが開始されたら、指を離してビューコントローラにポップバックをキャンセルさせます。すると、右のナビゲーションボタンの項目が消えます。左側のアイテムボタンにも同じ問題があります。このバグを再現するには、[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]
のようなfixSpaceItemを追加する必要があります。また、シミュレータではなく実際のデバイスでバグを再現できます。これが私のメインコードです:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
self.navigationItem.rightBarButtonItems = @[[self negativeSpacerWithWidth:5],[self rightButton]];
self.navigationItem.leftBarButtonItems = @[[self negativeSpacerWithWidth:5], [self leftButton]];
}
- (UIBarButtonItem *)leftButton {
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
[button setImage:[UIImage imageNamed:@"icon_app_back_normal"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
- (UIBarButtonItem *)rightButton {
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
[button setImage:[UIImage imageNamed:@"setting"] forState:UIControlStateNormal];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
- (UIBarButtonItem *)negativeSpacerWithWidth:(CGFloat)width {
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[spacer setWidth:width];
return spacer;
}
FixedSpace BarButtonItem
をBarButtonItem array
に追加するとバグのようです。ナビゲーションアイテムにオフセットを設定する場合は、ボタンのimageEdgeInsetsを変更するなど、別の方法を使用する必要がある場合があります。
- (void)viewDidLoad {
[super viewDidLoad];
// Do not set Fixed Space type button item.
self.navigationItem.leftBarButtonItem = [self leftButton];
self.navigationItem.rightBarButtonItem = [self rightButton];
// It work too
//self.navigationItem.leftBarButtonItems = @[[self leftButton], [self leftButton]];
//self.navigationItem.rightBarButtonItems = @[[self rightButton], [self rightButton]];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
- (UIBarButtonItem *)leftButton
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
//...
// to add offset you want
button.imageEdgeInsets = UIEdgeInsetsMake(0, -15, 0, 15);
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
- (UIBarButtonItem *)rightButton
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
//...
// to add offset you want
button.imageEdgeInsets = UIEdgeInsetsMake(0, 15, 0, -15);
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
let hamButtonWidthConstraint = hamButton.widthAnchor.constraint(equalToConstant: 40)
let hamButtonHeightConstraint = hamButton.heightAnchor.constraint(equalToConstant: 40)
hamButtonWidthConstraint.isActive = true
hamButtonHeightConstraint.isActive = true
ナビゲーションアイテム内に収まるように画像のサイズを変更してみましたが、機能しました。実際に画像のサイズを変更する必要はありませんが、以下の機能を使用して、実行時に画像のサイズを変更できます。
UIImage *imgCart = [self imageWithImage:[UIImage imageNamed:@"ic_cart"] scaledToSize:CGSizeMake(35, 35)] ;
UIButton *btnCart = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[btnCart addTarget:self action:@selector(btnCartClicked:) forControlEvents:UIControlEventTouchUpInside];
[btnCart setBackgroundImage:imgCart forState:UIControlStateNormal];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btnCart];
-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
//UIGraphicsBeginImageContext(newSize);
// In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
// Pass 1.0 to force exact pixel size.
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}