2013-09-26 24 views
14

Tôi có chế độ xem web đang cuộn như mong muốn bên dưới thanh điều hướng.Vị trí cuộn ban đầu của trang web iOS7 dưới Thanh điều hướng

Tuy nhiên, khi lần đầu tiên tôi tải bộ điều khiển, trang được tải trong chế độ xem web sẽ được cuộn sao cho nó phù hợp với đầu thanh điều hướng. Khi tôi cuộn chế độ xem web, phần chèn đúng có mặt ở trên cùng để đặt chính xác, nó chỉ là vị trí ban đầu không chính xác.

Làm cách nào để có được vị trí ban đầu được cuộn hoàn toàn lên trên cùng, bao gồm cả hình chữ nhật?

+2

Đây vẫn là vấn đề trong 7.0.4 và không có đề xuất nào bên dưới khắc phục. Bất kỳ ý tưởng nào khác? – Axeva

Trả lời

1

sử dụng dưới đây

CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; 
CGFloat navHeight = self.navigationController.navigationBar.frame.size.height; 
applicationFrame.origin.y = navHeight + 4; 
webView = [[UIWebView alloc] initWithFrame:applicationFrame]; 
12

Nếu bạn không nhớ có một thanh điều hướng đục, sau đó là giải pháp đơn giản nhất có thể để làm điều này trong bộ điều khiển xem có chứa xem web của bạn:

self.navigationController.navigationBar.translucent = NO; 

Vị trí của khung sau đó sẽ áp dụng cùng một hành vi như iOS6, kỳ diệu!

+4

Chắc chắn hoạt động. Tuy nhiên, những gì tôi thực sự muốn thấy là hành vi của một UITableViewController có sẵn trong UIViewController có chứa một UIWebView. –

4

Cách tôi giải quyết vấn đề này là với cuộc gọi lại ủy quyền webViewDidFinishLoad. Trong phương thức gọi lại cho chế độ xem web, tôi đặt làm tất cả công việc để làm cho chế độ xem cuộn của chế độ xem web trông chính xác.

[webView.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)]; 
[webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(64, 0, 0, 0)]; 
[webView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
5

Câu trả lời của Rick là chính xác ngoại trừ giá trị trên cùng phải là số âm, đây là những gì hiệu quả đối với tôi!

[self.webView.scrollView setContentInset:UIEdgeInsetsMake(-44, 0, 0, 0)]; 
[self.webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(-44, 0, 0, 0)]; 
[self.webView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 

Tôi đã sử dụng -44, nếu bạn không có thanh trạng thái ở trên cùng, bạn nên sử dụng -64.

+0

Giá trị phải dương. 44 hoặc 64. –

1

Bạn cũng có thể thiết lập các nội dung bù đắp của scrollview của webview trong viewDidAppear:, ví dụ:

[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO]; 

Thật không may, nó không có hiệu lực nếu đặt trong viewWillAppear:, vì vậy khi nhìn xuất hiện, bạn sẽ thấy một bước nhảy có thể nhìn thấy trong nội dung khi nó chuyển từ bên dưới thanh điều hướng đến vị trí mới của nó.

3

Tôi đã gặp sự cố tương tự và đã khắc phục sự cố đó. Giải pháp khá đơn giản:

Đi tới bảng phân cảnh, chọn trình điều khiển chế độ xem có chứa UIWebView của bạn và mở Thanh tra thuộc tính. Ở đây, bạn sẽ thấy tiêu đề "Mở rộng cạnh", chỉ cần bỏ chọn hộp "Dưới thanh hàng đầu" và tôi sẽ làm việc!

Hy vọng điều này sẽ hữu ích!

+0

Không thực sự những gì tôi yêu cầu.Điều này quay trở lại trước hành vi iOS7 nơi các giới hạn của webview bắt đầu tại (0, navbarheight). –

0

Giải pháp của tôi:

- (void)loadView { 
    ... 

    _offsetSet = NO; 
} 

- (void) viewDidLayoutSubviews { 

    if (!_offsetSet) { 
     [_webView.scrollView setContentOffset:CGPointMake(0, -self.topLayoutGuide.length) animated:NO]; 
    } 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    _offsetSet = YES; 
} 
0

Đối với một phiên bản tổng quát hơn của câu trả lời @ Puran của, chứ không phải là hardwiring 44 hoặc 64, có được nó từ topLayoutGuide. Ngoài ra, nếu bạn tải nhiều lần, bạn chỉ cần thay đổi các giá trị này một lần:

UIEdgeInsets insets = self.myWebView.scrollView.contentInset; 
if (UIEdgeInsetsEqualToEdgeInsets(insets, UIEdgeInsetsZero)) { 
    insets.top = -self.topLayoutGuide.length; 
    [self.myWebView.scrollView setContentInset:insets]; 
    [self.myWebView.scrollView setScrollIndicatorInsets:insets]; 
    [self.myWebView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
}