이전에 iOS 6.1을 사용하고 있었는데 지금은 iOS 7로 이동했습니다. 다른 문제와 함께 내비게이션 바에서 왼쪽 막대 버튼 항목의 왼쪽 공간과 오른쪽 버튼 막대 항목의 오른쪽 빈 공간이 상당히 iOS 6보다 IOS 7에서 더 많습니다.
탐색 모음에서 왼쪽, 오른쪽 막대 단추 항목의 빈 공간을 줄일 수있는 방법이 있는지 알고 싶습니다.
미리 감사드립니다.
이전에 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)
이 버그를 수정 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 */]
As of iOS 11 wont accept negative space width, in order to align the bar button items to the margin, I have used the below code.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
for view in (self.navigationController?.navigationBar.subviews)! {
view.layoutMargins = UIEdgeInsets.zero
}
}
스위프트 3.1
왼쪽 막대 버튼 항목에 음수 공간을 제공하려면 :
let backButton = UIButton.init(type: .custom)
backButton.frame = CGRect.init(x: 0, y: 0, width: 40, height: 40)
// negative space
backButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -44.0, bottom: 0, right: 0)
backButton.setImage(Ionicons.iosArrowBack.image(30, color: UIColor(hex: 0xFD6250)), for: .normal)
backButton.addTarget(self, action: #selector(InviteVC.goBack), for: .touchUpInside)
// set back button
self.navigationItem.leftBarButtonIteUIBarButtonItem.init(customView: backButton)
Negetive 공간은 iOS 11에서 작동하지 않습니다.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// to remove navigation bar extra margin
for view in (self.navigationController?.navigationBar.subviews)! {
view.layoutMargins = UIEdgeInsets.zero
}
}
위의 코드는 leftBarButtonItem 및 RightBarButtonItem 양쪽에서 여백을 제거합니다. 여백을 추가해야하는 경우 (여백 제거 후) 다음 코드를 추가하십시오.
let rightButton = UIButton(frame: CGRect(x: 0, y: 0, width: 17, height: 20))
rightButton.setImage(UIImage(named: "ic_cart"), for: .normal)
let rightBarButtomItem = UIBarButtonItem(customView: rightButton)
let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.fixedSpace, target: nil, action: nil)
spacer.width = 28 //This will add extra margin on right side
navigationItem.rightBarButtonItems = [spacer,rightBarButtomItem]
나는 당신이 UIButton
하위 클래스 와 함께 사용자 정의 버튼을 사용해야한다고 생각하고 하위 클래스에서 -alignmentRectInsets
. 적절한 에지가 올바르게 이동하도록하려면 양수 또는 음수 값이 필요한지 잊어 버렸습니다.하지만 하나가 작동하지 않으면 다른 쪽을 시도하십시오.
좋은 결정입니다. 감사합니다! 탐색 헤더의 왼쪽에 두 개의 요소 만 추가해야했습니다. 이것은 내 해결책입니다.
// Settings Button
// This trick correct spacing between two left buttons
UIBarButtonItem *settingsButtonItem = [[UIBarButtonItem alloc] init];
UIView *settingsButtonItemView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 22.0, 22.0)];
settingsButtonItem.customView = settingsButtonItemView;
UIButton *settingsButton = [UIButton buttonWithType:UIButtonTypeSystem];
settingsButton.frame = settingsButtonItemView.frame;
[settingsButton setImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal];
settingsButton.tintColor = [[[[UIApplication sharedApplication] delegate] window] tintColor];
[settingsButton addTarget:self action:@selector(showSettings:) forControlEvents:UIControlEventTouchDown];
[settingsButtonItemView addSubview:settingsButton];
// Star Button
UIBarButtonItem *starButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"star_gray"] style:UIBarButtonItemStyleBordered target:self action:@selector(showStarred)];
starButtonItem.width = 22.0;
NSLog(@"%f", starButtonItem.width);
// Negative Spacer
// It shifts star button to the left
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
negativeSpacer.width = -10.0;
NSArray *leftNavigtaionBarButtonItems = @[negativeSpacer, starButtonItem, settingsButtonItem];
[self.navigationItem setLeftBarButtonItems:leftNavigtaionBarButtonItems];