LeftBarItems と RightBarItems を使用すると、UIBarButtonItem のパディング/スペースが過剰に発生します (下の画像を参照)。UIBarButtonItems で使用されるアイコンには余分なパディングが含まれていません。だから私はこれを引き起こしているのか知りたいですか?
6 に答える
画像を移動できます
self.myBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 25, 0, -25);
Apple は、UIBarButtonItems の水平方向の間隔の制約を静かに増やしましたが、悲しいことに、UIBarButtonItems の水平方向の位置を調整するための UIAppearance メソッドをまだ追加していません。
最善の解決策 (私にとってはうまくいきました) は、UIBarButtonItems を使用して UIView にラップし、initWithCustomView:
そのカスタム ビューの境界を調整して、目的の位置を取得することです。これを行う方法についての良い答えがあります。
さらに一歩進めたい場合は、アプリ全体で使用するバー ボタンを返すクラス メソッドを使用して、UIBarButtonItem にカテゴリを作成できます。そうすれば、バーボタンが必要な場合は、次のように呼び出すことができます。
self.navigationItem.leftBarButtonItem = [UIBarButtonItem mySearchBarButtonItemWithTarget:self selector:@selector(search)];
iOS 7 のナビゲーション バーには、画像付きのボタンとテキスト付きのボタンの 2 種類のボタンがあります。私はそれを行うクラスを書きました。方法は次のとおりです。
GlobalUICommon.h:
@interface UIBarButtonItem(CustomUIOfONE)
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image highlightedImage:(UIImage*)highlightedImage xOffset:(NSInteger)xOffset target:(id)target action:(SEL)action;
+ (UIBarButtonItem*)barItemWithTitle:(NSString*)title xOffset:(NSInteger)xOffset target:(id)target action:(SEL)action;
@end
GlobalUICommon.m:
@implementation UIBarButtonItem(CustomUIOfONE)
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image highlightedImage:(UIImage*)highlightedImage xOffset:(NSInteger)xOffset target:(id)target action:(SEL)action
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
[button setImage:image forState:UIControlStateNormal];
[button setImage:highlightedImage forState:UIControlStateHighlighted];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[button setImageEdgeInsets:UIEdgeInsetsMake(0, xOffset, 0, -xOffset)];
}
UIBarButtonItem *customUIBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
return customUIBarButtonItem;
}
+ (UIBarButtonItem*)barItemWithTitle:(NSString*)title xOffset:(NSInteger)xOffset target:(id)target action:(SEL)action
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:title forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button.titleLabel setFont:[UIFont systemFontOfSize:15]];
[button setFrame:CGRectMake(0, 0, [button.titleLabel.text sizeWithFont:button.titleLabel.font].width + 3, 24)];
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[button setContentEdgeInsets:UIEdgeInsetsMake(0, xOffset, 0, -xOffset)];
}
UIBarButtonItem *customUIBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
return customUIBarButtonItem;
}
@end
YourViewController.m:
画像付きボタンの例:
UIBarButtonItem* leftButtomItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"yourImage"]
highlightedImage:[UIImage imageNamed:@"yourImage"]
xOffset:-11
target:self
action:@selector(yourHandler)];
self.navigationItem.leftBarButtonItem = leftButtomItem;
UIBarButtonItem* rightButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"yourImage"]
highlightedImage:[UIImage imageNamed:@"yourImage"]
xOffset:11
target:self
action:@selector(yourHandler)];
self.navigationItem.rightBarButtonItem = rightButtonItem;
テキスト付きボタンの例:
self.navigationItem.leftBarButtonItem = [UIBarButtonItem barItemWithTitle:@"yourText" xOffset:-11 target:self action:@selector(yourHandler:)];
self.navigationItem.rightBarButtonItem = [UIBarButtonItem barItemWithTitle:@"yourText" xOffset:11 target:self action:@selector(yourHandler:)];
それでおしまい。
ストーリーボードインターフェースを使用してこれを解決しました。
1. を選択しBar item
ます。
2. を選択しSize Inspector
ます。
ここでは、画像のインセットを見つけることができます 。ANDを使用するとtop
、バー アイテムの位置を変更できます。bottom
left
right
@Ludaがコメントしているように、解決策は
self.myBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 25, 0, -25);
ただし、@andrrs は、インセットが大きい場合、ここでも問題を指摘しています: ヒット領域です。この場合、HitTestEdgeInsets を設定する方法を実装する必要があります。以下はカテゴリメソッドです。
@implementation UIButton (Extensions)
@dynamic hitTestEdgeInsets;
static const NSString *KEY_HIT_TEST_EDGE_INSETS = @"HitTestEdgeInsets";
-(void)setHitTestEdgeInsets:(UIEdgeInsets)hitTestEdgeInsets {
NSValue *value = [NSValue value:&hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];
objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(UIEdgeInsets)hitTestEdgeInsets {
NSValue *value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS);
if(value) {
UIEdgeInsets edgeInsets; [value getValue:&edgeInsets]; return edgeInsets;
}else {
return UIEdgeInsetsZero;
}
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if(UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden) {
return [super pointInside:point withEvent:event];
}
CGRect relativeFrame = self.bounds;
CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);
return CGRectContainsPoint(hitFrame, point);
}
@end