[ios] UINavigationBar [iOS 7]에서 왼쪽, 오른쪽 UIBarButtonItem의 빈 공간을 편집하는 방법

이전에 iOS 6.1을 사용하고 있었는데 지금은 iOS 7로 이동했습니다. 다른 문제와 함께 내비게이션 바에서 왼쪽 막대 버튼 항목의 왼쪽 공간과 오른쪽 버튼 막대 항목의 오른쪽 빈 공간이 상당히 iOS 6보다 IOS 7에서 더 많습니다.

탐색 모음에서 왼쪽, 오른쪽 막대 단추 항목의 빈 공간을 줄일 수있는 방법이 있는지 알고 싶습니다.

미리 감사드립니다.



답변

나는 또한이 문제에 직면했다. 또한 iOS 7에는 더 많은 공간이 있다는 느낌이 있습니다. 그리고 저는 이것이 약 10 점 더 많다는 것을 알아 냈습니다. LeftBarItemButton가장자리에서 시작 하려면 보통 음수 공백을 사용 합니다. 이것은 당신에게도 유용 할 수 있습니다.

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

negativeSpacer.width = -16; // it was -6 in iOS 6

[self.navigationItem setLeftBarButtonItems:@[negativeSpacer, requiredButton]; /* this will be the button which you actually need */] animated:NO];


답변

@C_X 그의 대답을 기반으로 현재 장치의 iOS 버전을 기반으로 UIBarButtonItem을 추가하고 배치하는 범주를 만들었습니다.

// UINavigationItem+Additions.h
@interface UINavigationItem (Additions)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;
@end

// UINavigationItem+Additions.m
@implementation UINavigationItem (Additions)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        // Add a negative spacer on iOS >= 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                              target:nil action:nil];
        negativeSpacer.width = -10;
        [self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setLeftBarButtonItem:leftBarButtonItem];
    }
}

- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        // Add a negative spacer on iOS >= 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
        negativeSpacer.width = -10;
        [self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setRightBarButtonItem:rightBarButtonItem];
    }
}

@end

뷰 컨트롤러에서 이제 [self.navigationItem addLeftBarButtonItem:leftBarButtonItem];[self.navigationItem addRightBarButtonItem:rightBarButtonItem];

또한 서브 클래 싱 UIButton및 재정의를 시도 -alignmentRectInsets했지만 이로 인해 뷰 간 전환에 문제 가 생겼습니다 .


답변

Swift 2.0의 경우 다음과 같은 효과를 얻을 수있는 솔루션이었습니다.

(실제 값은 상황에 따라 다를 수 있습니다)

여기에 이미지 설명 입력

let captureButton = UIButton()
captureButton.setTitle("CAPTURE DETAILS", forState: .Normal)
captureButton.frame = CGRectMake(0, 0, 200, 95)
captureButton.addTarget(self, action: Selector("showCaptureDetailsForm:"), forControlEvents: .TouchUpInside) // *** See update below for Swift 2.2 syntax
captureButton.setBackgroundImage(UIImage(named: "blueTopRight"), forState: .Normal)

let rightBarButton = UIBarButtonItem()
rightBarButton.customView = captureButton

let negativeSpacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
negativeSpacer.width = -25;

self.navigationItem.setRightBarButtonItems([negativeSpacer, rightBarButton ], animated: false)

Swift 2.2 업데이트 :

Swift 2.2의 경우 action: Selector방법이 변경되었으며 다음과 같이 입력해야합니다.

captureButton.addTarget(self, action: #selector(YourViewController.showCaptureDetailsForm(_:)), forControlEvents: .TouchUpInside)


답변

이것은 내 솔루션입니다 Swift 3.0.

rightBtn.imageInsets = UIEdgeInsets(top: 0, left: -13.0, bottom: 0, right: 13.0)
self.navigationItem.rightBarButtonItem = rightBtn


답변

이 버그를 수정 UIButton하려면을 재정의 할 수 있도록 하위 클래스를 만들어야합니다 alignmentRectInsets. 내 테스트 UIEdgeInsets에서 버튼 위치에 따라 양의 오른쪽 오프셋 또는 양의 왼쪽 오프셋으로 a 를 반환해야합니다 . 이 숫자는 나에게 의미가 없지만 (상식에 따라 적어도 하나는 음수 여야 함) 실제로 작동하는 것은 다음과 같습니다.

- (UIEdgeInsets)alignmentRectInsets {
    UIEdgeInsets insets;
    if (IF_ITS_A_LEFT_BUTTON) {
        insets = UIEdgeInsetsMake(0, 9.0f, 0, 0);
    }
    else { // IF_ITS_A_RIGHT_BUTTON
        insets = UIEdgeInsetsMake(0, 0, 0, 9.0f);
    }
    return insets;
}

조정 시도를 제안한 @zev에게 특별히 감사드립니다 alignmentRectInsets.


답변

smek의 리드에 따라 카테고리를 만들었지 만 앞으로가 아닌 하위 호환성을 제공하도록 수정했습니다. iOS 7에서 원하는 방식으로 작동하도록 모든 것을 설정 한 다음 사용자가 더 낮은 것을 실행하면 작업을 시작합니다.

@interface UINavigationItem (BarButtonItemSpacingSupport)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;

@end

@implementation UINavigationItem (BarButtonItemSpacingSupport)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        // Add a spacer on when running lower than iOS 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                                                                        target:nil action:nil];
        negativeSpacer.width = 10;
        [self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setLeftBarButtonItem:leftBarButtonItem];
    }
}

- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        // Add a spacer on when running lower than iOS 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                           initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                           target:nil action:nil];
        negativeSpacer.width = 10;
        [self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setRightBarButtonItem:rightBarButtonItem];
    }
}

@end

그리고 이것을 전역 적으로 얻기 위해 UIViewController모든 뷰 컨트롤러가 상속 하는 얇은 하위 클래스가 있습니다.

@interface INFViewController : UIViewController

@end

@implementation INFViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        [self setupNavBarForPreIOS7Support];
    }
}

- (void)setupNavBarForPreIOS7Support {
    if (self.navigationController) {
        UINavigationItem *navigationItem = self.navigationItem;
        UIBarButtonItem *leftItem = navigationItem.leftBarButtonItem;
        UIBarButtonItem *rightItem = navigationItem.rightBarButtonItem;

        if (leftItem) {
            [navigationItem addLeftBarButtonItem:leftItem];
        }

        if (rightItem) {
            [navigationItem addRightBarButtonItem:rightItem];
        }
    }
}

@end

나는 OS 버전을 두 번 ( INFViewController카테고리에서 한 번 반복) 확인하고 있다는 것을 알고 있으며, 프로젝트의 어느 곳에서나 이것을 일회성으로 사용하고 싶을 경우 카테고리에 남겨 두었습니다.


답변

신속하게 당신은 이것을 할 수 있습니다

var negativeSpace:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
negativeSpace.width = -17.0
self.navigationItem.rightBarButtonItems = [negativeSpace, requiredButton /* this will be the button which you actually need */]