[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 */]