2009-05-21 32 views
22

Một số người có thể cho tôi biết cách thay đổi chiều cao thanh điều hướng không?Thay đổi UINavigationBar Height

Dưới đây là những gì tôi có cho đến nay:

CGFloat navBarHeight = 10; 
self.navigationController.navigationBar.frame.size.width = navBarHeight; 
+0

Đây là bản sao của câu hỏi này: http://stackoverflow.com/questions/892905/change-iphone-navigation-bars-height. –

+2

frame.size. ** width **? –

Trả lời

6

Hãy thử sử dụng -

CGFloat navBarHeight = 10.0f;  
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); 
[self.navigationController.navigationBar setFrame:frame]; 
+4

Không thực sự thay đổi bất cứ điều gì. Tôi đã cố gắng thiết lập khung khi tạo UINavigationController trong AppDelegate của mình. Không có thông báo lỗi hoặc bất cứ điều gì, nhưng chiều cao thanh điều hướng không thay đổi gì cả. Thử nghiệm với Xcode 4.4 và iOS 4.3, 5.0, 5.1. –

+0

@Cliff Viegas Cảm ơn – nivritgupta

3

self.navigationController.navigationBar.frame là một tài sản trên iOS phiên bản 4.x readonly

nó sẽ được thay đổi mặc dù , bạn sẽ thấy hành vi bất thường.

ví dụ, khi nhà nước ứng dụng thay đổi nền và lấy lại cho foreground thanh Navigation sẽ thấy ban chiều cao cỡ

21

Bạn không nên thay đổi chiều cao của thanh điều hướng. Từ Apple Lập trình Hướng dẫn về View Controller:

Tùy chỉnh Navigation Bar Appearance

Trong một giao diện điều hướng, một bộ điều khiển chuyển hướng sở hữu đối tượng UINavigationBar của nó và chịu trách nhiệm quản lý nó. Không được phép thay đổi đối tượng thanh điều hướng hoặc sửa đổi trực tiếp giá trị giới hạn, khung hoặc giá trị alpha của nó. Tuy nhiên, có một vài tính năng mà nó được phép sửa đổi, bao gồm:

● sở hữu

barStyle ● tài sản mờ

tài sản ● tintColor

(lấy từ Apple: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html)

- CẬP NHẬT - iOS 7 --- vẫn chỉ có các thuộc tính có sẵn có thể thay đổi nhưng dưới đây là hướng dẫn tuyệt vời về cách đạt được tính linh hoạt trong thanh điều hướng http://www.appcoda.com/customize-navigation-status-bar-ios-7/

+1

Điều này dường như không còn hiện diện trong nguyên tắc iOS7 nữa. Nó vẫn liệt kê các thuộc tính có thể truy cập trực tiếp, nhưng không đề cập đến bất cứ điều gì bị cấm sửa đổi. –

+1

Nó vẫn xuất hiện nhìn thấy - https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html –

+1

Thực ra nó là - tôi đã bỏ lỡ điều đó. Cảm ơn. –

25

Bạn có thể tạo ra một lớp thể loại dựa trên UINavigationBar như thế này

tập tin .h

#import UIKit/UIKit.h  
@interface UINavigationBar (myNave) 
- (CGSize)changeHeight:(CGSize)size; 
@end 

và file .m

#import "UINavigationBar+customNav.h" 
@implementation UINavigationBar (customNav) 
- (CGSize)sizeThatFits:(CGSize)size { 
    CGSize newSize = CGSizeMake(320,100); 
    return newSize; 
} 
@end 

Nó hoạt động rất tốt đẹp.

+0

hoạt động nhưng di chuyển UINavigationItem lên trên cùng, tiêu đề và các mục không được canh giữa theo chiều ngang – Anand

+0

@Anand: Vấn đề tương tự cũng có giải pháp cho điều này không? – iBapu

+1

Để recenter việc sử dụng tiêu đề '[tự.navigationBar setTitleVeritcalPositionAdjustment: (float) forBarMetrics: UIBarMetricsDefault]; 'where' float' là giá trị dương để đẩy tiêu đề xuống và giá trị âm để đẩy nó trở lại. Vì vậy, nếu bạn là thanh điều hướng là 44 (mặc định) và bạn làm cho nó 60, đặt 'float' thành -8 ((60-44)/2) để recenter nó –

6

Override - (void) phương pháp viewWillAppear trong viewController và Thử code dưới đây,

- (void)viewWillAppear { 

UINavigationBar *navigationBar = [[self navigationController] navigationBar]; 
CGRect frame = [navigationBar frame]; 
frame.size.height = 82.0f; 
[navigationBar setFrame:frame]; 
} 
+1

Đóng, nhưng điều này sẽ chồng chéo khung nhìn cơ bản thay vì dịch chuyển nó. – rwyland

+1

Có thể là do kiểu thanh điều hướng của bạn. Nếu nó là loại mờ, sau đó nó sẽ chồng chéo các quan điểm. Tôi nghĩ rằng nếu nó mờ đục, thì các cuộc phỏng vấn có thể tự động chuyển xuống. –

+2

Không, 44px đầu tiên sẽ không bị mờ, nhưng mọi thứ sau đó sẽ bị chồng chéo. Tôi cũng phát hiện ra rằng khung navigationBar sẽ thiết lập lại trên xoay màn hình hoặc trên resume ứng dụng (viewWillAppear không được gọi là tiếp tục ứng dụng). Thật đáng buồn là hack này sẽ không hoạt động chính xác. – rwyland

7

Tôi đã giải quyết vấn đề này, tôi tạo ra các lớp con của UINavigationController. Trong tệp MainNavigationViewController.m này, tôi viết lại phương thức viewDidLayoutSubviews(), trong đó tôi đặt khung cho self.navigationBar

4

Giải pháp đơn giản và hiệu quả nhất là thêm một danh mục vào thanh điều hướng.(nhưng có thể không phải là giải pháp tốt nhất)

@interface UINavigationBar (CustomHeight) 

@end 


@implementation UINavigationBar (CustomHeight) 

- (CGSize)sizeThatFits:(CGSize)size { 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus); 
} 
@end 

knavBarHeightNoStatus là chiều cao của thanh điều hướng của bạn. Chúng tôi sử dụng giới hạn UIScreen vì khung UINavigationBar là sai

PS: Hãy cẩn thận, bạn có thể có một số vấn đề sử dụng nó với một SideMenu

+1

Tôi đã thử tất cả các câu trả lời khác. Chỉ có một người này làm việc. –

2

Tôi chạy vào rất nhiều vấn đề tùy thuộc vào phương pháp được lựa chọn. Trong trường hợp cụ thể của tôi, thanh điều hướng bị ẩn trong suốt ứng dụng ngoại trừ trong Trình điều khiển chế độ xem cài đặt. Vì tôi cần chỉ định chiều cao tùy chỉnh của thanh điều hướng và hiển thị thanh điều hướng cùng lúc, khoảng cách giữa bộ điều khiển chế độ xem nguồn và Trình điều khiển chế độ xem cài đặt có hoạt ảnh rất cẩu thả.

Giải pháp tuyệt đối tốt nhất có thể tìm thấy tại đây: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2. Tôi vừa nhập danh mục vào Trình điều khiển Chế độ xem Cài đặt và trong viewDidLoad được gọi là phương thức setHeight: trên `self.navigationController.navigationBar '. Trông rất tuyệt!

1

mã sau sẽ không ảnh hưởng đến các thông số khác trong khung ngoại trừ chiều cao

[self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)]; 

nếu bạn muốn thay đổi các thông số khác có nghĩa là, chỉ cần chỉnh sửa bất kỳ một trong các thông số ....

0

Hãy thử mã này bên - (void)viewDidLayoutSubviews phương pháp,

CGFloat navBarHeight = 10.0f;  
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); 
[self.navigationController.navigationBar setFrame:frame]; 
0

Tạo chủng loại và trọng sizeTha tFits (_ size: CGSize) -> CGSize thay đổi phương thức Kích thước của UINavigationBar trên toàn bộ ứng dụng. Giả sử bạn muốn thay đổi chiều cao/kích thước UINavigationBar chỉ trong một ViewController cụ thể (trong trường hợp của tôi)

Đây là cách tôi đã làm.

extension UINavigationBar { 
    open override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let v = self.value(forKey: "frame") as? CGRect 
     return v?.size ?? CGSize(width: UIScreen.main.bounds.width, height: 44) 
    } 
} 

trong người gọi ViewController sẽ trông như thế

override func viewDidLoad() { 
    super.viewDidLoad() 
    configureNavigationBar() 
} 

private func configureNavigationBar() { 
    var naviBarFrame = self.navigationController?.navigationBar.frame 
    naviBarFrame?.size.height = 74 
    let rect = naviBarFrame ?? CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 74) 
    self.navigationController?.navigationBar.setValue(rect, forKey: "frame") 
} 
6

sizeThatFits: không còn làm việc với các lớp con iOS11 UINavigationBar. Apple Engineering đã xác nhận rằng kỹ thuật này chưa bao giờ được hỗ trợ và với kích thước thay đổi iOS11ThatFits: không còn được tư vấn.

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