2013-09-19 2 views
46

Я испытываю чрезмерное заполнение/интервал UIBarButtonItem при использовании LeftBarItems и RightBarItems (см. Рисунок ниже). Значки, используемые в UIBarButtonItems, не содержат дополнительных дополнений. Поэтому я хотел бы знать, что вызывает это?iOS7 чрезмерная навигационная кнопка пуска

enter image description here

+4

Я также вижу это. Заинтересованы в решении. –

ответ

27

Я использую это для того, чтобы удалить пространство перед первым элементом.

Однако он не работает между системными элементами, такими как UIBarButtonSystemItemAdd, только с UIBarButtonItem, у которого есть изображение.

@interface UIBarButtonItem (NegativeSpacer) 
+(UIBarButtonItem*)negativeSpacerWithWidth:(NSInteger)width; 
@end 
@implementation UIBarButtonItem (NegativeSpacer) 
+(UIBarButtonItem*)negativeSpacerWithWidth:(NSInteger)width { 
    UIBarButtonItem *item = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
          target:nil 
          action:nil]; 
    item.width = (width >= 0 ? -width : width); 
    return item; 
} 
@end 

Используйте это так:


UIBarButtonItem *item0 = [UIBarButtonItem negativeSpacerWithWidth:13]; 
UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"sidebar.png"] 
                  style:UIBarButtonItemStylePlain 
                 target:vc 
                 action:@selector(sideMenuAction:)]; 
NSArray* items = @[item0, item1]; 
[vc.navigationItem setLeftBarButtonItems:items animated:NO]; 
[vc.navigationItem setLeftItemsSupplementBackButton:YES]; 
+0

Спасибо, что это начало. Но с учетом того, что даже разработчикам приложений facebook пришлось прибегнуть к внедрению новой нижней панели инструментов, в которой размещались элементы, которые раньше находились в навигационной панели, я думаю, что это останется. –

+0

Изменено имя -negativeSpacerWithWidth: он правильно обрабатывает отрицательные значения. –

+0

Отлично спасибо – neoneye

8

Apple, молча увеличил горизонтальные ограничения интервала для UIBarButtonItems и, к сожалению, до сих пор еще не добавил методов UIAppearance для регулировки горизонтального позиционирования UIBarButtonItems.

Лучшее решение (которое сработало для меня) - это обернуть UIBarButtonItems в UIView с помощью initWithCustomView: и настроить границы этого пользовательского представления, чтобы получить желаемое позиционирование. Here's a good answer on how to do this.

Если вы хотите сделать еще один шаг, вы можете создать категорию в UIBarButtonItem с помощью методов класса, которые возвращают кнопки панели, которые вы используете во всем приложении. Таким образом, когда вы потребность кнопки бар, вы можете назвать что-то вроде:

self.navigationItem.leftBarButtonItem = [UIBarButtonItem mySearchBarButtonItemWithTarget:self selector:@selector(search)]; 
7

Есть два вида кнопки на панели навигации в прошивке 7: кнопка с изображением и кнопкой с текстом. Я написал класс, чтобы сделать это. Вот как:

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:)]; 

Вот так.

+0

Спасибо, это сработало для меня –

25

Вы можете перемещать изображение

self.myBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 25, 0, -25); 
+1

К сожалению, это не перемещает область попадания кнопки, только ее изображение. Но хорошее решение, если вам просто нужно немного сдвинуть кнопку! – andrrs

2

Я решил эту проблему с помощью интерфейса storybord.

1.Выберите Bar item.

2.Выберите Size Inspector.

Здесь вы можете найти изображения Inset, используя top, bottomleft И, right вы можете изменить положение элемента панели.

0

Как @Luda комментарии, решение заключается в

self.myBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 25, 0, -25); 

Однако @andrrs также указывает на проблему здесь, когда вставка велика: хит области. В этом случае мы должны реализовать способ setHitTestEdgeInsets. Ниже приведен метод категории:

@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 
Смежные вопросы