2012-06-11 41 views
13

tôi đang tạo ra một UIBarButtonItem và thêm nó vào thanh điều hướng của tôi như vậy:Thay đổi chiều rộng của một UIBarButtonItem trong một UINavigationBar

(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; 
} 

Có vẻ đúng khi tôi chạy, nhưng tôi có thể chọn mục nút thanh bằng cách khai thác thanh điều hướng ở bất kỳ vị trí nào từ x = 0 đến khoảng 100. Làm thế nào tôi có thể điều chỉnh vùng có thể chọn để có chiều rộng 30 px?

+2

Tôi sợ rằng tôi không nghĩ rằng có một cách để điều chỉnh vùng lựa chọn. Một câu hỏi mặc dù, tại sao bạn muốn chiều rộng là 30 px? Hướng dẫn giao diện người dùng của iOS tuyên bố rằng kích thước tối thiểu thoải mái của các phần tử giao diện người dùng có thể chia sẻ là 44 x 44 điểm. http://developer.apple.com/library/ios/# documentation/UserExperience/Khái niệm/MobileHIG/Đặc điểm/Đặc điểm.html –

+0

Hmm, ok cảm ơn vì liên kết đến hướng dẫn. Có vẻ hơi lạ một chút là khu vực có thể lựa chọn quá rộng. – Darren

+0

@AbdSaniAbdJalal chúng ta có thể thay đổi chiều rộng của 'barbuttonitem' trong bảng phân cảnh không? – aircraft

Trả lời

12

Darren,

Một cách tiếp cận bạn có thể xem xét là tạo UIBarButtonItem bằng cách gọi initWithCustomView. Điều này không lý tưởng vì bạn không nhận được trạng thái "đã chọn" trong hộp VÀ bạn phải tổng hợp nền có viền của mình (nếu muốn cái nhìn đó) với hình ảnh nút của bạn, nhưng với điều đó bạn có thể trực tiếp chỉ định khung cho mục thanh công cụ. Nếu bạn đang sử dụng văn bản cho tiêu đề của mình thay vì hình ảnh, bạn vẫn có thể cần thêm hình nền làm tiểu sử. Dù sao, tôi đang gặp vấn đề tương tự ngay bây giờ và mã này làm việc cho tôi:

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; 

Ngay bây giờ đây là cách duy nhất tôi biết hạn chế tính năng tự động kích thước của UIBarButtonItems thêm vào navigationItem của UINavigationController .

[EDITED]

Hoặc try Maggie's solution, which is more thorough than mine.

+2

chỉ hoạt động khi tôi sử dụng 'UIButton' làm customView và không phải' UIImageView' – Kreutzer

+1

giải pháp này sẽ không hoạt động vì nó không có nút nào cả. Sử dụng 'UIButton' để thay thế. – Raptor

6

Bạn có thể làm điều đó bằng cách thả một hình ảnh đến mục nút thanh từ xây dựng giao diện và thay đổi độ rộng của giao diện tùy chỉnh với mã này:

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

Điều quan trọng với điều này là để nhận ra rằng bạn đang thay đổi chiều rộng của chế độ xem tùy chỉnh, thay vì chính bản thân số UIBarButton. do đó

Mã này là:

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

Bạn cũng sẽ cần phải kích hoạt sự thay đổi bố trí:

[myNavigationBar setNeedsLayout]; 

Tất cả điều này đi mà không nói rằng việc bố trí đang được thực hiện với Auto Sizing và khung. Các cuộc xâm nhập vào thanh điều hướng với Bố cục Tự động không mang lại thành công nào. Xem câu hỏi của tôi Auto Layout with UINavigationBar and UIBarButtonItem.

Rất tiếc, chỉ nhận ra rằng mã của tôi gần giống với @oscartzombie. Không cố ý! Tôi sẽ để lại câu trả lời này vì tôi nghĩ rằng nó đáng giá thêm cách bố trí và các điểm khác, ngoài việc giải thích mà không cần tham chiếu đến Giao diện Bulder hoặc hình ảnh cụ thể.

+0

Tôi đã gặp vấn đề với kích thước của UIBarButtonItem tùy chỉnh của tôi, giải pháp đang gọi '[self.navigationController.navigationBar setNeedsLayout];' trong phương thức '- (void) viewDidLoad' của trình điều khiển xem của tôi. – LunaCodeGirl

5

Cách tiếp cận sau đây hoạt động, xem mã để thay đổi chiều rộng và chiều cao của nút cũng như để thêm mục tác vụ.

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; 

Lưu ý: Các mục tiêu và hành động của UIBarButtonItem không áp dụng cho xem hình ảnh

Các vấn đề liên quan