2012-10-25 8 views
15

Tôi đang tải UIWebView theo cách thức. Trang web có một số đầu vào hoạt động chính xác như dự định trong iOS 5. Tuy nhiên, trong iOS 6, bất cứ lúc nào đầu vào được lấy nét, bàn phím sẽ tự động 'định tâm' của biểu mẫu ngay cả khi đầu vào có nhiều chỗ được hiển thị ở trên bàn phím. Vì một số đầu vào nằm ở đầu trang nên điều này buộc chúng không thể xem được vì vậy người dùng không thể nhìn thấy những gì họ đang gõ. Cuộn trở lại để xem các yếu tố đầu vào khiến bàn phím ngừng hoạt động cho đến khi bị loại bỏ và tập trung lại đầu vào (lần lượt cuộn nó ra khỏi chế độ xem một lần nữa). Đây có phải là hành vi mong đợi trong iOS 6 không? Có cách nào để giữ cho webview không di chuyển khi đầu vào tăng tiêu điểm (giống như cách iOS 5 hoạt động)?UIWebView cuộn xuống trên tiêu điểm nhập liệu iOS 6 chỉ

+0

Khung UIWebView của bạn là gì? – Jessedc

+0

Bạn có thể cho tôi liên kết/url những gì bạn đang mở trong chế độ xem web hay không. Vì vậy mà tôi có thể hiểu vấn đề ur tốt hơn. – Swati

Trả lời

11

Nếu không biết các hoạt động bên trong mã của bạn, tôi sẽ cố gắng giúp đỡ hết mức có thể. Nếu không có gì khác, tôi hy vọng sẽ cung cấp một số thức ăn cho sự suy nghĩ. Bạn đã hỏi hai câu hỏi:

Hành vi mong đợi trong iOS6?

Điều bạn thấy là khá kỳ quặc. Thật lạ khi webView đang căn giữa biểu mẫu thay vì căn giữa trường nhập. Và nó chắc chắn sẽ không gây ra trường nhập hoạt động để di chuyển ra khỏi xem. Hơn nữa, bàn phím dường như ngừng hoạt động, điều này khá kỳ quặc. Tuy nhiên, nó được mong đợi để xem hành vi khác nhau trong iOS 5 và 6 liên quan đến việc di chuyển webView. Như bạn đã nói, iOS 5 cuộn inputField vào xem trong khi iOS6 đặt nó vào chính giữa.

Có cách nào để giữ cho chế độ xem web không bị cuộn khi đầu vào tăng tiêu điểm (như cách iOS 5 hoạt động)?

Có. Tôi cung cấp mã để làm điều này dưới đây - cụ thể là để ngăn chặn các webView từ di chuyển. Nếu đó là chính xác những gì bạn muốn làm, sau đó tuyệt vời. Tuy nhiên, việc dừng webView khỏi cuộn không giống như nhận được hành vi tương tự như iOS5. Tuy nhiên, tôi muốn cung cấp cho bạn tùy chọn này khi bạn yêu cầu.

#import "ViewController.h" 

@interface ViewController() <UIScrollViewDelegate> { 
    CGPoint origin; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
    [self.webView loadRequest:request]; 
    self.webView.scrollView.delegate = self; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 

    // NOTE THAT SIMPLY DISABLING THE SCROLL WILL NOT PREVENT KEYBOARD SCROLL 
    //[self.webView.scrollView setScrollEnabled:NO]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)keyboardWillShow { 
    NSLog(@"keyboard"); 
    origin = self.webView.scrollView.contentOffset; 

} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSLog(@"scroll"); 
    [self.webView.scrollView setContentOffset:origin]; 
} 

@end 

Nếu bạn muốn hành vi cuộn phù hợp ...

Tôi mất một thời gian để mã lên sửa đổi cuộn này. Bạn có thể sử dụng nó làm tài liệu tham khảo để tạo hành vi cuộn của riêng bạn nhất quán trên iOS 5 & 6. Trong mã này: Khi người dùng nhấp vào hộp nhập văn bản trên trang web, mã sẽ dừng hành vi cuộn mặc định bằng cách giữ trang được cuộn đến vị trí hiện tại của nó. Thật không may, không có cách nào để hủy bỏ tất cả di chuyển, nhưng thay vào đó bạn phải ghi đè cuộn.Khi cuộn mặc định đã bị "chặn", nó sẽ lấy vị trí của hộp nhập hoạt động và cuộn đến vị trí đó. Thao tác này sẽ đặt hộp nhập hiện hoạt ở đầu màn hình. Bạn có thể sửa đổi điều này theo sở thích của bạn. Ví dụ: bạn có thể sử dụng [UIScrollView scrollRectToVisible] để làm cho nó giống iOS5 hơn.

#import "ViewController.h" 

@interface ViewController() <UIScrollViewDelegate> { 
    CGPoint origin; 
    CGPoint activeElementOrigin; 
    BOOL pauseScroll; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
    [self.webView loadRequest:request]; 
    self.webView.scrollView.delegate = self; 

    pauseScroll = NO; 
    origin = CGPointZero; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 
} 

- (void)keyboardWillShow { 
    NSLog(@"keyboard"); 
    pauseScroll = YES; 
    origin = self.webView.scrollView.contentOffset; 
} 

- (void)keyboardDidShow { 
    NSLog(@"keyboard DID SHOW"); 
    pauseScroll = NO; 
    [self.webView.scrollView setContentOffset:activeElementOrigin animated:YES]; 
} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSLog(@"scroll"); 

    if (pauseScroll) { 
     [self.webView.scrollView setContentOffset:origin animated:NO]; 

     NSString *javaScript = [NSString stringWithFormat:@"function f(){ var textField = document.activeElement; return textField.getBoundingClientRect().top; } f();"]; 
     NSString *textFieldRectTop = [self.webView stringByEvaluatingJavaScriptFromString:javaScript]; 
     activeElementOrigin = origin; 
     activeElementOrigin.y = [textFieldRectTop floatValue]-10; 
    } 
} 


@end 

Nếu mã này giúp bạn, bạn sẽ rất vui khi nhận phần thưởng cho tôi. Tôi sẽ được đánh giá cao.

+0

Cảm ơn, rất kỹ lưỡng. Tôi đã có thể làm việc dựa trên các ví dụ của bạn. – Yeti42

+0

Không hoạt động trên iOS 7. – Dmitry

+0

Tôi đã dành hàng giờ để giải quyết vấn đề này trong ứng dụng của mình và giải pháp của bạn cuối cùng đã giải quyết được vấn đề. Cám ơn rất nhiều! –

0

Một cách giải quyết có thể được vô hiệu hóa các cuộn trong UIWebView này:

UIScrollView *scrollView = webView.scrollView; 
[scrollview setScrollEnabled:NO]; 
[scrollView bounces:NO]; 

khác có thể được thiết lập UIEdgeInsets của scrollview này nhưng tôi không biết nhiều về việc này.

Tôi nghĩ đây là hành vi tiêu chuẩn trong cả iOS 5 và 6 để cuộn để tạo trường nhập ngay trên đầu bàn phím te (giống như Safari).

+0

thiết lập scrollEnabled chỉ ngăn cản người dùng cuộn, không di chuyển hệ thống bàn phím –

+0

Ok biết rõ về phản hồi của bạn – dulgan

0

Câu trả lời kiểm tra về bài đăng này có câu trả lời của bạn: How to make a UITextField move up when keyboard is present?

Tóm lại, bạn cần phải di chuyển lên xem có chứa các yếu tố đầu đang được đẩy ra khỏi tầm nhìn. Bài đăng cũng chứa mã mẫu về cách thực hiện.

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

+0

câu hỏi cụ thể liên quan đến một webView. Có sự khác biệt lớn giữa trường nhập UITextField và trường nhập biểu mẫu trong trang web. bài đăng bạn tham chiếu sẽ không hoạt động trên webViews. –