2013-09-27 203 views

Trả lời

45

Nếu tôi hiểu bạn một cách chính xác thử

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; 
+0

Có! Cảm ơn bạn. – Gnamm

+33

Có thể đáng chú ý là (như của iOS 7) để làm việc này bạn cũng phải làm [[UINavigationBar xuất hiện] setBackgroundImage: [[UIImage alloc] init] forBarMetrics: UIBarMetricsDefault]. –

+4

Nó không hoạt động trên iOS 7. Tôi đã đặt thuộc tính mờ của thanh điều hướng thành sai. Có thể đó là một vấn đề? –

12

dựa trên câu trả lời muffed2k + lập trình Thomas nhận xét, đây là những gì tôi đang sử dụng để hiển thị UINavigationBar mà không hình nền (iOS5.1/6.0) và không có biên giới phía dưới (ios7.0):

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6) 
    { 
     [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; 
     [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; 
    }else 
    { 
     [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; 
    } 
48

Đó không hoạt động trên iOS7 với navigation mờ hay không ...

Một dán từ documenta của Apple sự;

Mô tả Hình ảnh bóng được sử dụng cho thanh điều hướng. Giá trị mặc định bằng 0, tương ứng với hình ảnh bóng mặc định. Khi không phải là số không, thuộc tính này đại diện cho một hình ảnh bóng tùy chỉnh để hiển thị thay vì mặc định. Để hiển thị hình ảnh bóng tùy chỉnh, hình nền tùy chỉnh cũng phải được đặt bằng phương thức setBackgroundImage: forBarMetrics:. Nếu hình nền mặc định được sử dụng, thì hình ảnh bóng mặc định sẽ được sử dụng bất kể giá trị của thuộc tính này.

Vì vậy, về cơ bản bạn cần triển khai setBackgroundImage đó. Lưu ý bổ sung, trên iOS7 bạn sẽ không sử dụng giao diện nữa nhưng bạn sẽ sửa đổi thanh Điều hướng trong ngữ cảnh viewController nơi bạn hiện đang ở.

Đó là:

[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]]; 
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault]; 

Trong trường hợp của tôi, tôi đặt điều này trong viewDidLoad (hành vi tùy chỉnh có thể được thêm vào cho mỗi UIViewController trong UINavigationViewController).

+0

Cảm ơn bạn đã trả lời cập nhật và liên kết đến tài liệu. – JVillella

+2

Trong trường hợp của tôi, đó là câu trả lời hoạt động, không phải câu trả lời đầu tiên. Cảm ơn bạn đã viết mã và tài liệu. –

+1

Sử dụng giao diện vẫn có vẻ hoạt động tốt trên 7+, nhưng bạn sẽ cần phải đặt cả 'shadowImage' và' backgroundShadowImage' – bloudermilk

0

Nếu bạn đang nhắm mục tiêu iOS 7 và không thiết lập một hình nền thì điều này sẽ làm việc:

 CGFloat navigationBarWidth = self.navigationController.navigationBar.frame.size.width; 
     CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height; 
     CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height; 

     UIGraphicsBeginImageContextWithOptions(CGSizeMake(navigationBarWidth, navigationBarHeight + statusBarHeight), NO, 0.0); 
     UIImage *blank = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     [[UINavigationBar appearance] setBackgroundImage:blank forBarMetrics:UIBarMetricsDefault]; 

     //the following line takes away the border but only works if a background image is set (above) 
     [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; 

tôi đã có ý tưởng từ câu trả lời @ muffe2k và this SO post.

+0

Mọi phản hồi về phiếu bầu xuống? – kraftydevil

5

Nếu bạn đang sử dụng Swift và bạn gặp câu hỏi này, hãy thử này trong ViewController chính của bạn:

override func viewDidLoad() { 
    super.viewDidLoad() 

    /// ... 

    navigationController?.navigationBar.shadowImage = UIImage(); 
    navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) 

    //... 
} 

Dựa trên câu trả lời @ wolffan của trên

2

Tôi biết có một câu trả lời chấp nhận này nhưng một cách khác để làm điều đó là thiết lập clipToBounds thành true.

Đây là một dòng mã để làm điều đó trong nhanh chóng

self.navigationController?.navigationBar.clipsToBounds = true 

Làm việc đối với tôi như một say mê.

+2

nó có thể phá vỡ nền thanh trạng thái, tâm trí bạn –

+0

@ user5209290 là chính xác. Thanh trạng thái của tôi không còn được pha trộn với thanh điều hướng khi cắt bớt các giới hạn của thanh điều hướng. – Daniel

4

Đối với tôi follwing làm việc trên iOS 7 đến 9 + khi translucent được thiết lập để false

UINavigationBar.appearance().transluscent = false 
UINavigationBar.appearance().shadowImage = UIImage() 
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics:.Default) 
+0

Tôi nghĩ rằng bạn đang thiếu một khoảng thời gian cho. – noobular

1

cho mục tiêu c

self.navigationController.navigationBar.clipsToBounds = YES; 
1

trình như một say mê: Swift 3.x phiên bản

navigationController?.navigationBar.shadowImage = UIImage() 
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)