2012-06-11 5 views
13

는 내가 UIBarButtonItem을 만드는 등처럼 내 탐색 모음에 추가하고 : 나는 실행할 때변경 폭은

(void)viewDidLoad { 

    ... 

    // Add the refresh button to the navigation bar 
    UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [refreshButton setFrame:CGRectMake(0,0,30,30)]; 
    [refreshButton setImage:[UIImage imageNamed:@"G_refresh_icon.png"] forState:UIControlStateNormal]; 
    [refreshButton addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *refreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:refreshButton] autorelease]; 
    self.navigationItem.leftBarButtonItem = refreshBarButton; 
} 

그것은 올바른 보이는,하지만 난 눌러 바 버튼 항목을 선택할 수 있습니다 탐색 표시 줄은 x = 0에서 대략 100까지입니다. 선택 가능한 영역을 30 픽셀 너비로 조정하려면 어떻게해야합니까?

+2

나는 내가 선택 영역을 조정하는 방법이라고 생각하지 않습니다 두려워 해요. 그러나 질문은 왜 너비가 30px가 되길 원합니까? iOS 휴먼 인터페이스 가이드 라인에 따르면 태핑 가능한 UI 요소의 편안한 최소 크기는 44 x 44 포인트입니다. http://developer.apple.co.kr/library/ios/# documentation/UserExperience/Conceptual/MobileHIG/Characteristics/Characteristics.html –

+0

흠, 가이드 라인 링크를 이용해 주셔서 감사합니다. 선택할 수있는 영역이 너무 넓다는 것이 약간 이상하게 보입니다. – Darren

+0

@AbdSaniAbdJalal은 스토리 보드에서'barbuttonitem'의 너비를 바꿀 수 있습니까? – aircraft

답변

12

대런, 당신은 고려해 볼 수 있습니다

한 가지 방법은 initWithCustomView를 호출하여 UIBarButtonItem을 만드는 것입니다. 이것은 "선택"상태를 즉시 꺼내지 않고, 테두리가있는 배경 (원하는 경우)을 버튼 이미지와 합성해야한다는 점에서 이상적이지는 않지만 더 직접적으로 프레임을 지정할 수 있습니다 툴바 항목. 이미지 대신 제목에 텍스트를 사용하는 경우 배경 이미지를 하위보기로 추가해야 할 수 있습니다. 어쨌든, 난 지금 같은 문제가있어이 코드는 나를 위해 작동 :

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"button-image.png"]]; 
imageView.frame = CGRectMake(0, 0, 43, 30); 

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageView]; 

self.navigationItem.leftBarButtonItem = barButtonItem; 

지금이 내가 UIBarButtonItems의 자동 크기 조정을 제한 알고있는 유일한 방법은 UINavigationController가의 navigationItem에 추가 .

[EDITED]

또는 try Maggie's solution, which is more thorough than mine.

+2

은'UIButton'을 customView로 사용하고 UIImageView가 아닌 ​​경우에만 작동합니다 – Kreutzer

+1

이 솔루션은 버튼 동작이 전혀 없으므로 작동하지 않습니다. 대신에'UIButton'을 사용하십시오. – Raptor

6

당신은 인터페이스 빌더에서 바 버튼 항목에 이미지를 삭제하고이 코드를 사용하여 사용자 지정보기의 폭을 변경하여 작업을 수행 할 수 있습니다

CGRect frame = self.navigationItem.leftBarButtonItem.customView.frame; 
frame.size.width = 141; 
self.navigationItem.leftBarButtonItem.customView.frame = frame; 
5

이 가진 중요한 것은 당신을 실현하는 것입니다 UIBarButton 자체가 아닌 사용자 정의보기의 너비가 변경됩니다.

코드

은 그러므로 : 레이아웃이 자동 크기 조정 및 프레임으로 수행되고 있음을 말없이

[myNavigationBar setNeedsLayout]; 

이 모든 간다 : 또한 레이아웃 변경을 트리거해야합니다

CGRect resizedFrame = myBarButtonItem.customView.frame; 
resizedFrame.size.width = myNewWidth; 
myBarButtonItem.customView.frame = resizedFrame; 

. 자동 레이아웃이있는 탐색 모음으로의 침입은 성공하지 못했습니다. 내 질문 Auto Layout with UINavigationBar and UIBarButtonItem을 참조하십시오.

미안하지만 내 코드가 @oscartzombie와 거의 동일하다는 것을 알았습니다. 의도적 인 것은 아닙니다! Interface Bulder 나 이미지를 특별히 언급하지 않고 레이아웃과 다른 점을 추가 할 가치가 있다고 생각할 때이 답변을 남겨 둘 것입니다.

+0

커스텀 UIBarButtonItem의 크기에 문제가 있었는데, 솔루션은'[self.navigationController.navigationBar setNeedsLayout];을 내 View Controller의'- (void) viewDidLoad' 메소드에서 호출하고있었습니다. – LunaCodeGirl

5

다음 방법을 사용하면 코드의 너비와 높이를 변경하고 작업 항목을 추가 할 수 있습니다.

UIButton *imageButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 22, 22)]; 
[imageButton setBackgroundImage:[UIImage imageNamed:@"message_button"] forState:UIControlStateNormal]; 
[imageButton addTarget:self action:@selector(messageButtonTapped) forControlEvents:UIControlEventAllEvents]; 
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageButton]; 
self.navigationItem.leftBarButtonItem = leftBarButtonItem; 

참고 : 대상과 UIBarButtonItem의 동작은 이미지 뷰에 적용되지 않습니다