2012-11-05 19 views
8

Tôi có một ứng dụng cho đến bây giờ tôi đã sử dụng một UINavigationController với một UINavigationBar có thuộc tính translucent = YES. Điều này có nghĩa là khung nhìn nội dung của UINavigationController (tức là các khung nhìn từ các bộ điều khiển khung nhìn bạn đẩy) là toàn màn hình (trừ thanh trạng thái).Làm cách nào để có được UINavigationController KHÔNG thay đổi kích thước khung nhìn khi thiết lập thuộc tính mờ?

Tuy nhiên, nếu bạn đặt navigationBar.translucent = NO, chế độ xem vùng chứa này trở nên ngắn hơn 44pt, như tôi cho rằng Apple đã giả định bạn không cần bất kỳ nội dung nào dưới thanh điều hướng mờ đục.

... ngoại trừ nếu bạn đang làm những gì chúng tôi đang làm và đang sử dụng thanh điều hướng cuộn đi (xem This Post on how to do that) Vì vậy, tôi muốn biết nếu điều này là có thể.

Tôi muốn có mờ = KHÔNG, nhưng có mọi thứ hoạt động như thể nó vẫn được đặt thành CÓ. Tôi thích chức năng của mờ = YES, nhưng tôi không thực sự muốn thanh được UIKit làm mờ.

Trả lời

0

Tôi đã tìm thấy giải pháp hoạt động, mặc dù nó thực sự là một chút hack.

Ý tưởng là cung cấp cho thanh điều hướng mờ một bản sao đục. Thật không may tôi không hài lòng với giải pháp ở chỗ nó bẩn và không đóng gói và giới thiệu một số vấn đề tiềm năng, nhưng tôi hạnh phúc vì nó đã hoàn thành công việc.

Trong lớp điều khiển chế độ xem cơ sở của ứng dụng của tôi (ví dụ: MyViewController: UIViewController), trong phương thức viewDidLoad, tôi khởi tạo một ivar mới UIView * _navigationBarBG và cung cấp cho nó cùng khung như self.navigationController.navigationBar. Sau đó tôi đặt thuộc tính backgroundColor của nó thành [UIColor whiteColor] mặc dù đây là cách bạn đạt được một số màu hơn tôi đoán. [EDIT: Nếu bạn muốn là một purist (giá trị màu còn lại chính xác như họ đến từ .psd), bạn có thể làm cho _navigationBarBG một UIImageView và sử dụng nền tùy chỉnh của bạn ở đó, và nền của UINavigationBar thực tế bạn thiết lập để vẽ rõ ràng (hoặc kéo dài một hình ảnh 1px trong suốt nếu bạn muốn sử dụng một điển hình 'thay đổi thanh điều hướng bằng cách sử dụng một hình ảnh' công thức đó là ở đâu đó trên internet)]

if(self.navigationController) 
{ 
    _navigationBarBG = [[UIView alloc] initWithFrame: self.navigationController.navigationBar.frame]; 
    _navigationBarBG.backgroundColor = [UIColor whiteColor]; 
    [self.view addSubview:_navigationBarBG]; 
} 

THEN, (và đây là một phần không hấp dẫn, nhưng tôi không thấy bất kỳ cách nào khác), tôi thêm chế độ xem này dưới dạng một chế độ xem phụ. NHƯNG, bất cứ khi nào bạn thường thực hiện cuộc gọi đến [self.view addSubview: anyView], bạn phải đảm bảo rằng bạn gọi [self.view insertSubview: anyView belowSubview: _navigationBarBG];

if (_navigationBarBG) 
    [self.view insertSubview: anyView belowSubview:_navigationBarBG]; 
else 
    [self.view addSubview: anyView]; 

Nếu bạn quên điều đó, các chế độ xem được thêm này sẽ trượt dưới nền thanh điều hướng của bạn và trông lạ. Vì vậy, bạn cần phải biết rằng đây là một nguồn lỗi.

TẠI SAO TÔI LÀM VIỆC NÀY? Một lần nữa bạn có thể yêu cầu ... Tôi muốn có thể có một thanh điều hướng cuộn mà cuộn ra khỏi con đường khi bạn di chuyển xuống xem bảng của bạn, do đó cho người dùng không gian màn hình nhiều hơn nữa.Này được thực hiện bằng cách sử dụng các đại biểu scrollview (scrollViewDidScroll :) và cũng viewWillAppear:

// FIRST DEAL WITH SCROLLING NAVIGATION BAR 
CALayer *layer = self.navigationController.navigationBar.layer; 

CGFloat contentOffsetY = scrollView.contentOffset.y; 
CGPoint newPosition; 


if (contentOffsetY > _scrollViewContentOffsetYThreshold && self.scrollingNavigationBarEnabled) { 
    newPosition = CGPointMake(layer.position.x, 
           22 - MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0)); // my nav bar BG image is 48.0 tall 
    layer.position = newPosition; 
    [_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens 
} 
else 
{ 
    newPosition = kNavBarDefaultPosition; // i.e. CGPointMake(160, 22) -- portrait only 
    layer.position = newPosition; 
    [_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens 
} 
+0

cuối cùng tôi đã đi với giải pháp này và không phải là câu trả lời ở trên. tôi đã thử một thời gian ngắn nhưng không có nhiều thành công. tôi nghĩ rằng iOS làm rất nhiều thiết lập lại của khung self.view, do đó, không muốn gây rối với điều đó. cách tôi trình bày chỉ là 'lưng heo' chuyển động của một thành phần khác mà tôi biết đang hoạt động. nó chỉ là một chút bẩn trong đó bạn phải nhớ làm thế nào để chèn subviews và không thêm subviews và kiểm tra sự tồn tại. nhưng nó hoạt động tốt. – horseshoe7

1

Nó không nhất thiết là một câu trả lời hay nhưng bạn chỉ có thể bù đắp tầm nhìn của bạn cao nếu bạn không mờ.

//This won't take into account orientation and probably other details 
if(!self.navigationController.navigationBar.isTranslucent) 
{ 
    self.view.frame = CGRectMake(0,0,-44,self.view.bounds.size.height); 
} 

Bạn có thể đặt điều đó trong chế độ xemDidLoad hoặc viewWillAppear và nếu bạn có nhiều bộ điều khiển chế độ xem, bạn chỉ có thể phân lớp tất cả và đặt logic của bạn trong phân lớp.

+0

hmmm ... nó làm cho tôi nghĩ rằng tôi có thể làm một cái gì đó như thế này trong một lớp con của UINavigationController thay vào đó và không phải lộn xộn bộ điều khiển xem của tôi với loại mã đó. sẽ đăng những phát hiện của tôi. cảm ơn! – horseshoe7

+0

vâng, đó không phải là giải pháp vì khi bạn kiểm tra thuộc tính chế độ xem của UINavigationController, nó thực sự chiếm toàn bộ cửa sổ và kích thước khung không bao giờ thay đổi. Nó phải có một số khung nhìn container nội bộ cho các khung nhìn của các bộ điều khiển khung nhìn trên ngăn xếp của nó. – horseshoe7

+1

Vâng đó là những gì đang xảy ra đó là lý do tại sao bạn nên làm mã này trong bộ điều khiển xem của bạn nếu bạn muốn nó có khả năng làm việc. Dù bằng cách nào bạn đang đi ngược lại hành vi bản địa và chỉ thay đổi hành vi của bố cục xem có thể là giải pháp tốt hơn. – rooster117

0

tôi đang tìm kiếm một câu trả lời cho điều này như tôi muốn subviews tôi sẽ được ở (0,0) và không (0,44) (trong tham chiếu đến các giới hạn màn hình), nhưng tôi không thể tìm thấy câu trả lời về cách thiết lập điều này trong NavigationController, mà tôi nghĩ rằng sẽ là một tài sản bao gồm.

Điều tôi làm cuối cùng rất đơn giản là thêm phần phụ vào bộ điều khiển điều hướng có chiều rộng và chiều cao của Thanh Điều hướng, nhưng sau đó chèn phần phụ vào bên dưới Thanh Điều hướng.

Bây giờ cài đặt này là Translucent = YES, nhưng nó vẫn xuất hiện chắc chắn và các bản xem phụ hoạt động như thế nào tôi muốn.

CHỈNH SỬA: Sau khi đọc lại bài đăng gốc, tôi cho rằng nếu bạn sắp mở thanh điều hướng, bạn sẽ phải tính đến việc ẩn và hiển thị subview mới khi bạn làm như vậy với nav thanh

10

gì làm việc cho tôi là để thêm extendedLayoutIncludesOpaqueBars = true trong viewDidLoad

một cái gì đó như thế này

override func viewDidLoad() { 
    super.viewDidLoad() 
    extendedLayoutIncludesOpaqueBars = true 
} 

Hy vọng nó wi sẽ làm việc cho bạn cũng như

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