UINavigationBar에서 UIBarButtonItem의 위치 변경
UINavigationBar에서 UIBarButtonItem의 위치를 어떻게 변경할 수 있습니까? 내 버튼이 정상 위치보다 약 5px 더 높기를 바랍니다.
이를 수행하는 특별히 좋은 방법은 없습니다. 정말해야하는 경우 가장 좋은 방법은 UINavigationBar를 하위 클래스로 만들고 재정 의하여 layoutSubviews
호출 [super layoutSubviews]
한 다음 버튼의 뷰를 찾아 위치를 변경하는 것입니다.
이 코드는 이미지 배경 및 사용자 지정 위치가있는 UINavigationBar의 뒤로 단추를 만듭니다. 트릭은 중간 뷰를 만들고 경계를 수정하는 것입니다.
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *backBtnImage = [UIImage imageNamed:@"btn-back"];
UIImage *backBtnImagePressed = [UIImage imageNamed:@"btn-back-pressed"];
[backBtn setBackgroundImage:backBtnImage forState:UIControlStateNormal];
[backBtn setBackgroundImage:backBtnImagePressed forState:UIControlStateHighlighted];
[backBtn addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
backBtn.frame = CGRectMake(0, 0, 63, 33);
UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 63, 33)];
backButtonView.bounds = CGRectOffset(backButtonView.bounds, -14, -7);
[backButtonView addSubview:backBtn];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButton;
변환 및 사용자 정의보기를 사용하여 해결했습니다.
(빠른)
// create the button
let suggestImage = UIImage(named: "tab-item-popcorn-on")!.imageWithRenderingMode(.AlwaysOriginal)
let suggestButton = UIButton(frame: CGRectMake(0, 0, 40, 40))
suggestButton.setBackgroundImage(suggestImage, forState: .Normal)
suggestButton.addTarget(self, action: Selector("suggesMovie:"), forControlEvents:.TouchUpInside)
// here where the magic happens, you can shift it where you like
suggestButton.transform = CGAffineTransformMakeTranslation(10, 0)
// add the button to a container, otherwise the transform will be ignored
let suggestButtonContainer = UIView(frame: suggestButton.frame)
suggestButtonContainer.addSubview(suggestButton)
let suggestButtonItem = UIBarButtonItem(customView: suggestButtonContainer)
// add button shift to the side
navigationItem.rightBarButtonItem = suggestButtonItem
이 문제를 발견하고 낙담 한 iOS 5 용으로 개발중인 분들을 위해 ... 다음과 같이 시도해보십시오.
float my_offset_plus_or_minus = 3.0f;
UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithTitle:@"title"
style:UIBarButtonItemStyleDone
target:someObject action:@selector(someMessage)];
[item setBackgroundVerticalPositionAdjustment:my_offset_plus_or_minus forBarMetrics:UIBarMetricsDefault];
가장 좋은 방법은 https://stackoverflow.com/a/17434530/1351190에 설명 된대로 UINavigationBar를 서브 클래 싱하는 것입니다.
내 예는 다음과 같습니다.
#define NAVIGATION_BTN_MARGIN 5
@implementation NewNavigationBar
- (void)layoutSubviews {
[super layoutSubviews];
UINavigationItem *navigationItem = [self topItem];
UIView *subview = [[navigationItem rightBarButtonItem] customView];
if (subview) {
CGRect subviewFrame = subview.frame;
subviewFrame.origin.x = self.frame.size.width - subview.frame.size.width - NAVIGATION_BTN_MARGIN;
subviewFrame.origin.y = (self.frame.size.height - subview.frame.size.height) / 2;
[subview setFrame:subviewFrame];
}
subview = [[navigationItem leftBarButtonItem] customView];
if (subview) {
CGRect subviewFrame = subview.frame;
subviewFrame.origin.x = NAVIGATION_BTN_MARGIN;
subviewFrame.origin.y = (self.frame.size.height - subview.frame.size.height) / 2;
[subview setFrame:subviewFrame];
}
}
@end
도움이 되었기를 바랍니다.
아래 코드를 시도하십시오.
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleDone target:self action:nil];
[button setBackgroundVerticalPositionAdjustment:-20.0f forBarMetrics:UIBarMetricsDefault];
[[self navigationItem] setRightBarButtonItem:button];
이 코드에서 'y'위치를 변경하는 데 사용됩니다. 요구 사항에 따라 'y'값 (여기서는 -20.0f)을 변경합니다. 값이 양수이면 버튼 위치 아래로 내려갑니다. 값이 음수이면 버튼 위치가 올라갑니다.
버튼이 오른쪽으로 더 오도록 설정해야했습니다. Swift에서 UIAppearance를 사용하여 수행 한 방법은 다음과 같습니다. 수직 위치 속성도 있으므로 어떤 방향 으로든 조정할 수 있다고 생각합니다.
UIBarButtonItem.appearance().setTitlePositionAdjustment(UIOffset.init(horizontal: 15, vertical: 0), forBarMetrics: UIBarMetrics.Default)
이것은 프레임을 직접 엉망으로 만들거나 사용자 지정 하위보기를 추가하는 것보다 훨씬 덜 침습적 인 것 같습니다.
If you're simply using an image and NOT the default chrome, you can use negative image insets (set in the size inspector) to move your image around inside the UIBarButtonItem (handy because by default the horizontal padding can result in the image being further to the inside than you want). You can use the image insets to position the image outside of the bounds of the UIBarButtonItem, as well, and the entire vicinity of the left-hand-side button is tappable, so you don't have to worry about ensuring it's positioned near a tap target. (at least, within reason.)
내가 찾을 수있는 가장 좋은 해결책은 왼쪽 / 오른쪽에 추가 공간이 포함 된 하위 뷰로 UIBarButtonItem을 초기화하는 것입니다. 이렇게하면 서브 클래 싱에 대해 걱정할 필요가없고 제목과 같은 탐색 모음 내의 다른 요소의 레이아웃을 변경할 필요가 없습니다.
예를 들어 버튼을 14 개 왼쪽으로 이동하려면 다음을 수행합니다.
UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, image.size.width + 14, image.size.height)];
UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(-14, 0, image.size.width, image.size.height);
[button setImage:image forState:UIControlStateNormal];
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
[containerView addSubview:button];
UIButton* button2 = [UIButton buttonWithType:UIButtonTypeCustom];
button2.frame = CGRectMake(0, 0, image.size.width + 14, image.size.height);
[button2 addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
[containerView addSubview:button2];
UIBarButtonItem* item = [[[self alloc] initWithCustomView:containerView] autorelease];
- 스위프트 3
- 사용자 지정 탐색 모음 높이
- 제목 점프 없음
1 단계 : Appearance API를 사용하여 제목 위치를 설정합니다. 예를 들어 AppDelegate의 didFinishLaunchingWithOptions에서
UINavigationBar.appearance().setTitleVerticalPositionAdjustment(-7, for: .default)
2 단계 : UINavigationBar 하위 클래스
class YourNavigationBar: UINavigationBar {
let YOUR_NAV_BAR_HEIGHT = 60
override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width,
height: YOUR_NAV_BAR_HEIGHT)
}
override func layoutSubviews() {
super.layoutSubviews()
let navigationItem = self.topItem
for subview in subviews {
if subview == navigationItem?.leftBarButtonItem?.customView ||
subview == navigationItem?.rightBarButtonItem?.customView {
subview.center = CGPoint(x: subview.center.x, y: YOUR_NAV_BAR_HEIGHT / 2)
}
}
}
}
@Anomie 말했듯이, 우리는 필요 서브 클래스 UINavigationBar
, 및 재정의 layoutSubviews()
.
이렇게하면 모든 오른쪽 바 버튼 항목이 내비게이션 바의 오른쪽에 단단히 부착됩니다 (기본적으로 약간 왼쪽으로 조정되는 것과 반대) .
class AdjustedNavigationBar: UINavigationBar {
override func layoutSubviews() {
super.layoutSubviews()
if let rightItems = topItem?.rightBarButtonItems where rightItems.count > 1 {
for i in 0..<rightItems.count {
let barButtonItem = rightItems[i]
if let customView = barButtonItem.customView {
let frame = customView.frame
customView.frame = CGRect(x: UIApplication.sharedApplication().windows.last!.bounds.size.width-CGFloat(i+1)*44, y: frame.origin.y, width: frame.size.width, height: frame.size.height)
}
}
}
}
}
UINavigationController의 UINavigationBar 속성을 설정하는 유일한 위치는 다음과 같이 init ()입니다.
let controllerVC = UINavigationController(navigationBarClass: AdjustedNavigationBar.self, toolbarClass: nil)
controllerVC.viewControllers = [UIViewController()]
두 번째 줄 은 UINavigationController 의 루트 뷰 컨트롤러 를 설정합니다 . (우리는 그것을 통해 설정할 수 없기 때문에init(rootViewController:)
스위프트 3.1
let cancelBarButtonItem = UIBarButtonItem()
cancelBarButtonItem.setBackgroundVerticalPositionAdjustment(4, for: .default)
vc.navigationItem.setLeftBarButton(cancelBarButtonItem, animated: true)
다음은 Swift 3을 사용한 Adriano의 솔루션입니다. 저에게 효과가 있었던 유일한 솔루션이었고 여러 가지를 시도했습니다.
let suggestImage = UIImage(named: "menu.png")!
let suggestButton = UIButton(frame: CGRect(x:0, y:0, width:34, height:20))
suggestButton.setBackgroundImage(suggestImage, for: .normal)
suggestButton.addTarget(self, action: #selector(self.showPopover(sender:)), for:.touchUpInside)
suggestButton.transform = CGAffineTransform(translationX: 0, y: -8)
// add the button to a container, otherwise the transform will be ignored
let suggestButtonContainer = UIView(frame: suggestButton.frame)
suggestButtonContainer.addSubview(suggestButton)
let suggestButtonItem = UIBarButtonItem(customView: suggestButtonContainer)
// add button shift to the side
navigationItem.leftBarButtonItem = suggestButtonItem
나의 경우에는
barbuttonItem의 프레임을 변경하여 공백을 사용자 정의하십시오.
barButtonItems를 동적으로 추가, 제거합니다.
tableview의 contentOffset.y로 색조 색상 변경
최소 대상이 iOS 11 인 경우 viewDidLayoutSubviews에서 barButton 프레임을 변경할 수 있습니다.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Change the navigationBar item frames
if let customView = wishButton.customView?.superview {
customView.transform = CGAffineTransform(translationX: 7.0, y: 0)
}
if let customView = gourmetCountButton.customView?.superview {
customView.transform = CGAffineTransform(translationX: 9.0, y: 0)
}
}
그러나 iOS 11에서만 작동합니다.
또한 fixedSpace를 사용해 보았습니다. 그러나 여러 navigationBarButton 항목에서 작동하지 않았습니다.
let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
space.width = -10
그래서 customView의 너비를 변경하여 수평 공간을 조정했습니다.
이것은 내 barButtonItem 클래스 중 하나입니다.
final class DetailShareBarButtonItem: UIBarButtonItem {
// MARK: - Value
// MARK: Public
***// Change the width to adjust space***
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32.0, height: 30.0))
override var tintColor: UIColor? {
didSet {
button.tintColor = tintColor
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setButton()
}
required override init() {
super.init()
setButton()
}
// MARK: - Function
// MARK: Private
private func setButton() {
// Button
button.setImage( #imageLiteral(resourceName: "navibarIcShare02White").withRenderingMode(.alwaysTemplate), for: .normal)
button.tintColor = .white
button.imageEdgeInsets = UIEdgeInsetsMake(0, 1.0, 1.0, 0)
button.imageView?.contentMode = .scaleAspectFill
let containerView = UIView(frame: button.bounds)
containerView.backgroundColor = .clear
containerView.addSubview(button)
customView = containerView
}
}
이것이 결과입니다.
iOS 9 ~ 11에서 테스트했습니다 (Swift 4).
UIBarButtonItem
사용자 정의보기로 초기화 하고 사용자 정의보기에서 오버로드 layoutSubviews
합니다.
-(void) layoutSubviews {
[super layoutSubviews];
CGRect frame = self.frame;
CGFloat offsetY = 5;
frame.origin.y = (44 - frame.size.height) / 2 - offsetY;
self.frame = frame;
}
버튼의 삽입을 사용하여 언제든지 조정할 수 있습니다. 예를 들면
UIButton *toggleBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[toggleBtn setFrame:CGRectMake(0, 0, 20, 20)];
[toggleBtn addTarget:self action:@selector(toggleView) forControlEvents:UIControlEventTouchUpInside];
[toggleBtn setImageEdgeInsets:((IS_IPAD)? UIEdgeInsetsMake(0,-18, 0, 6) : UIEdgeInsetsMake(0, -3, 0, -3))];
UIBarButtonItem *toggleBtnItem = [[UIBarButtonItem alloc] initWithCustomView: toggleBtn];
self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:searchBtnItem, toggleBtnItem, nil];
그것은 나를 위해 작동합니다.
여기 내 요구에 충분한 간단한 해결 방법이 있습니다. UINavigationBar의 오른쪽에 정보 버튼을 추가했지만 기본적으로 가장자리에 너무 가깝습니다. 프레임의 너비를 확장하여 오른쪽에 필요한 추가 간격을 만들 수있었습니다.
UIButton *info = [UIButton buttonWithType:UIButtonTypeInfoLight];
CGRect frame = info.frame;
frame.size.width += 20;
info.frame = frame;
myNavigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]initWithCustomView:info]autorelease];
사용자 지정 단추의 이미지 가장자리 삽입을 조정하여이 문제의 해결책을 찾았습니다. 앱에서 탐색 모음의 높이를 높이라는 요구 사항이 있었고 높이를 높이면 rightBarButtonItem 및 leftBarButtonItem 이미지의 위치가 지정되지 않은 문제가 발생합니다.
아래 코드를 찾으십시오.
UIImage *image = [[UIImage imageNamed:@"searchbar.png"];
UIButton* searchbutton = [UIButton buttonWithType:UIButtonTypeCustom];
[searchbutton addTarget:self action:@selector(searchBar:) forControlEvents:UIControlEventTouchUpInside];
searchbutton.frame = CGRectMake(0,0,22, 22);
[searchbutton setImage:image forState:UIControlStateNormal];
[searchbutton setImageEdgeInsets:UIEdgeInsetsMake(-50, 0,50, 0)];
// Make BarButton Item
UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithCustomView:searchbutton];
self.navigationItem.rightBarButtonItem = navItem;
이것이 누구에게나 도움이되기를 바랍니다.
Affine transform은 필요한 작업을 수행 할 수 있습니다. 제 경우에는 디자이너가 16x16 닫기 아이콘을줬고 44x44 탭 영역을 만들고 싶습니다.
closeButton.transform = CGAffineTransform(translationX: (44-16)/2, y: 0)
closeButton.snp.makeConstraints { make in
make.size.equalTo(CGSize(width: 44, height: 44))
}
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: closeButton)
왼쪽 막대 위치 변경 및 이미지 가장자리 삽입을 사용하는 탐색 막대
스위프트 4
let leftBarButtonItem = UIBarButtonItem.init(image: UIImage(named:"ic_nav-bar_back.png"), landscapeImagePhone: nil, style: .plain, target: viewController, action: #selector(viewController.buttonClick(_:)))
leftBarButtonItem.imageInsets = UIEdgeInsets(top: 0, left: -15, bottom: 0, right: 0)
leftBarButtonItem.tintColor = UIColor(hex: 0xED6E19)
viewController.navigationItem.setLeftBarButton(leftBarButtonItem, animated: true)
참고 URL : https://stackoverflow.com/questions/5761183/change-position-of-uibarbuttonitem-in-uinavigationbar
'Programing' 카테고리의 다른 글
ScrollView 레이아웃이 전체 화면을 채우지 않습니다. (0) | 2020.11.19 |
---|---|
How to get file path using Storage facade in laravel 5? (0) | 2020.11.19 |
C # : 메모리 부족 예외 (0) | 2020.11.19 |
C #으로 문자열에서 텍스트 찾기 (0) | 2020.11.19 |
기존 테이블에 자동 증가 ID를 추가 하시겠습니까? (0) | 2020.11.19 |