UINavigationBar [iOS 7]에서 왼쪽, 오른쪽 UIBarButton 항목의 빈 공간을 편집하는 방법
이전에는 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오버라이드(override)-alignmentRectInsets하지만 이것 때문에 서로의 관점을 바꾸는 문제가 생겼습니다.
스위프트 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 업데이트:
스위프트 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. 제가 테스트한 결과, 당신은 A를 반환해야 합니다.UIEdgeInsets버튼 위치에 따라 오른쪽 오프셋이 양수이거나 왼쪽 오프셋이 양수입니다.이 숫자들은 제게 말이 되지 않습니다. (상식적으로 적어도 하나는 음수여야 합니다.) 하지만 실제로 작동하는 것은 다음과 같습니다.
- (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.
smeck의 리드에 따라 카테고리를 만들었지만 포워드가 아닌 하위 호환성을 제공하도록 수정했습니다.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:
let negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
negativeSpacer.width = -10
self.navigationItem.leftBarButtonItems = [negativeSpacer, yourBarButtonItem]
스위프트 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)
iOS 11부터 네거티브 공간이 작동하지 않습니다.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// to remove navigation bar extra margin
for view in (self.navigationController?.navigationBar.subviews)! {
view.layoutMargins = UIEdgeInsets.zero
}
}
위 코드는 왼쪽 바버튼 항목과 오른쪽 바버튼 항목 양쪽에서 여백을 제거합니다.마진을 추가해야 할 경우(마진 제거 후) 다음 코드를 추가합니다.
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]
나를 위해 일했습니다
오른쪽BarButton.customView?transform = CGAF fineTransform (번역X: 10, y: 0)
사용자 정의 버튼을 사용해야 할 것 같습니다.UIButtonsubclass, 그리고 subclass에서 override.적절한 에지가 올바르게 이동되도록 하려면 양수 값이 필요한지 음수 값이 필요한지는 잊어버리지만, 하나가 작동하지 않으면 다른 하나를 시도해 보십시오.
좋은 결정입니다, 정말 감사합니다!네비게이션 헤더의 왼쪽에 두 가지 요소만 추가하면 되었습니다.이것이 제 해결책입니다.
// 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];
언급URL : https://stackoverflow.com/questions/18914812/how-to-edit-empty-spaces-of-left-right-uibarbuttonitem-in-uinavigationbar-ios
'source' 카테고리의 다른 글
| SQL Server와 Oracle 중 확장성 측면에서 더 나은 것은 무엇입니까? (0) | 2023.09.17 |
|---|---|
| 폴리곤 PHP에서 점 찾기 (0) | 2023.09.17 |
| 현재 날짜보다 30일 전에 얻는 방법은? (0) | 2023.09.17 |
| Excel에서 프로그래밍 방식으로 활성 워크북 숨기기 (0) | 2023.09.17 |
| AJAX로 부트스트랩 팝업 콘텐츠를 로드합니다.이것이 가능합니까? (0) | 2023.08.28 |
