Làm cách nào để ngăn UINavigationBar che đầu xem trong iOS 7?


99

Sau khi cập nhật lên Xcode 5, các thanh điều hướng trong tất cả các chế độ xem ứng dụng của tôi đã chuyển xuống. Dưới đây là một số ảnh chụp màn hình, ảnh đầu tiên hiển thị mọi thứ trong chế độ xem khi nó được kéo xuống và ảnh thứ hai hiển thị tất cả mọi thứ không bị ảnh hưởng. Thanh tìm kiếm sẽ bắt đầu ở vị trí của thanh điều hướng.

Tất cả nội dung Tất cả nội dung ở chế độ Chờ

Bất cứ ai biết làm thế nào tôi có thể sửa chữa điều này?

chỉnh sửa: tôi đã thử đề xuất này trước đây:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Nhưng nó mang lại kết quả rất kỳ lạ.

Cố gắng giải quyết

Điều này có thể là do tôi có một "trình đơn trang chiếu" trong bộ điều khiển chế độ xem này đang xuất hiện do tính trong suốt của thanh điều hướng.


Đây là một giải pháp khác cho vấn đề này. stackoverflow.com/a/51491645/10148333
Afonso

Câu trả lời:


234

Đặt thuộc tính trong suốt của thanh điều hướng thành KHÔNG :

self.navigationController.navigationBar.translucent = NO;

Điều này sẽ sửa chế độ xem không bị đóng khung bên dưới thanh điều hướng và thanh trạng thái.

Nếu bạn phải hiển thị và ẩn thanh điều hướng, hãy sử dụng

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

trong viewDidLoadphương pháp của bạn .


1
Tôi đã đặt điều này theo viewDidLoadnhưng nó không mang lại thay đổi.
Sam D20

13
làm cho nó trong chế độ xemDidLayoutSubviews
Hindu

1
Thêm điều này vào viewDidLayoutSubviews đã thực hiện thủ thuật. Tôi đánh giá cao sự giúp đỡ quý ông!
Sam D20

Xin chào, bất kỳ câu hỏi? hay là khen?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; đã giúp tôi
luky

32

Theo iOS 7mặc định, tất cả giá trị thuộc tính trong mờ của Bộ điều khiển là CÓ, vì vậy bạn đặt thuộc tính mờ KHÔNG cho vấn đề này.

self.navController.navigationBar.translucent = NO;

2
Không có thuộc tính "navController". Sử dụng cái này: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

tôi tạo đối tượng điều hướng thanh điều khiển trong đại biểu ứng dụng và đặt tên navController.
Sumit Mundra

21

Bạn có thể vô hiệu hóa "Mở rộng các cạnh" trong Trình kiểm tra thuộc tính của Bộ điều khiển Chế độ xem của màn hình này (như được hiển thị trong hình ảnh bên dưới):

nhập mô tả hình ảnh ở đây


12

Điều này cũng hoạt động nhanh trên iOS 8.1

navigationController?.navigationBar.translucent = false

8

Nếu bạn muốn giữ độ trong suốt navigationBar, viewDidLoadhãy viewWillAppearthêm dòng mã này vào cuối hoặc trong dòng mã sau:

[self.view sendSubviewToBack:self.tableView]

Bằng cách nào đó nếu scrollViewlớp con của bạn ( UITableView, UICollectionViewv.v.) ở mức index0 trong chế độ xem hiện tại của bạn subviews, nó sẽ tự động điều chỉnh các nội dung theo ý bạn navigationBar. Và nó cũng không ảnh hưởng đến giao diện người dùng của bạn trong các phiên bản trước iOS7.


CHỈNH SỬA Nếu bạn khởi tạo theo UITableViewchương trình, thì tốt nhất là thêm nó vào dạng xem bằng cách sử dụng[self.view insertSubview:self.tableView atIndex:0];


Đây phải là câu trả lời chính xác. Nếu bạn đang thêm chế độ xem phụ theo chương trình, bạn chỉ có thể thực hiện [self.view insertSubview:self.tableView atIndex:0];thay vì gửi chế độ xem lại sau khi thêm.
smitt04

Chính xác. Nhưng nếu không biết cách anh ấy khởi tạo bộ điều khiển của mình (theo lập trình, trình tạo giao diện), chúng tôi không thể cho rằng đó là giải pháp tốt nhất. Mặc dù tôi đã chỉnh sửa câu trả lời của mình.
jbouaziz

Điều này hoạt động nhưng trông giống như một vụ hack. Có thông báo nào trong tài liệu chính thức về điều này không?
John Tracid

4

Swift 4 :

Đặt dòng mã sau trong phương thức viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

Bạn có thể thêm phương thức này vào bộ điều khiển chế độ xem của mình như được hiển thị trên URL này :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Một cách tiếp cận khác là đặt self.automaticallyAdjustsScrollViewInsets = YES;trên bộ điều khiển chế độ xem của bạn. Điều này được kích hoạt theo mặc định. Nhưng trong trường hợp của bạn:

Tôi thấy bạn đang sử dụng EGORefreshHeaderView. Nó chơi với contentInset của UITableView. Vì vậy, khi bạn phát hành nó, tiêu đề sẽ đặt lại nội dung hàng đầu thay vì khôi phục giá trị trước đó.


-1

Nếu bạn muốn có toàn quyền kiểm soát các chế độ xem và tránh các điều chỉnh bị lỗi của iOS, hãy phân lớp UITableView và điều chỉnh các nội dung (cả cuộn và chỉ báo) trong - (void) willMoveToWindow: (UIWindow *) newWindow. Làm việc cho tôi.


-4

Một tùy chọn khác là mở tệp Info.plist của bạn ở chế độ mã nguồn và nhập thông tin sau:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Hi vọng điêu nay co ich.


1
Tôi không nghĩ rằng điều này sẽ ảnh hưởng đến quan điểm cả.
Enrico Susatyo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.