2013-09-28 236 views
9

Khi bàn phím bị ẩn, scrollview sẽ trở lại nội dung gốc của nóInset, nhưng nó không hoạt động trong iOS7. Đặt nội dung của scrollviewInset khi bàn phím được hiển thị đang hoạt động nhưng khi bàn phím bị ẩn, contentInset của scrollview không thể đặt thành inset zero. Mã:iOS7 UIScrollView contentInset not working

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:Nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil]; 
} 

- (void)keyboardWasShown:(NSNotification *)notif 
{ 
    CGSize keyboardSize = [[[notif userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0); 


    UIScrollView *scrollView = (UIScrollView *)self.view; 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    CGRect rect = self.view.frame; 
    rect.size.height -= keyboardSize.height; 
    if (!CGRectContainsPoint(rect, self.wishContentField.frame.origin)) { 
     CGPoint point = CGPointMake(0, self.wishContentField.frame.origin.y - keyboardSize.height); 
     [scrollView setContentOffset:point animated:YES]; 
    } 

} 
- (void)keyboardWasHidden:(NSNotification *)notif 
{ 
    UIEdgeInsets zeroInsets = UIEdgeInsetsZero; 
    UIScrollView *scrollView = (UIScrollView *)self.view; 
    [scrollView setContentInset:zeroInsets]; 
    scrollView.scrollIndicatorInsets = zeroInsets; 
} 
+2

bạn có thể giải thích như thế nào nó không làm việc (làm thế nào nó hành vi sau khi ẩn bàn phím)? Lưu ý rằng trên iOS 7, nếu bạn có một 'navigationBar' mờ, trình điều khiển chế độ xem của bạn sẽ thiết lập một inset hàng đầu cho scrollViews của bạn nếu không được thiết lập khác. Đây có thể là trường hợp ở đây, vì bạn đang đặt 'contentInset.top = 0', vì vậy nó có thể ẩn một số nội dung đằng sau' navigationBar' hoặc 'statusBar'. –

+0

Cảm ơn bạn đã trả lời. Tôi đặt đầu vào navigationBar.frame.size.height, và nó đang hoạt động ngay bây giờ. –

+1

Viết câu trả lời và cho tôi một số tín dụng;) –

Trả lời

9

Hãy thử điều này một:

self.automaticallyAdjustsScrollViewInsets = NO;

này đang làm việc cho tôi ...

0

Vì vậy, chỉ vì tôi vẫn tìm thấy câu trả lời này hữu ích, đây là những gì Tôi đã làm. Tôi lấy lời khuyên của @ alex-i và bình luận của @ yong-ho. Nhưng vì lý do nào đó chiều cao của thanh điều hướng không đủ.

UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height + 20.0f, 0.0, 0.0, 0.0); 
scrollView.contentInset = contentInsets; 
scrollView.scrollIndicatorInsets = contentInsets; 

Như tôi đã nói, tôi phải thêm 20.0f hoặc nội dung của tôi vẫn bị cắt. Không chắc chắn lý do tại sao. Nếu tôi hình dung ra tôi sẽ cập nhật câu trả lời của mình.

+0

Tôi cũng đã gặp phải sự cố này, tôi phải thêm khoảng 90 vào contentInsets, scrollIndicatorInsets hoạt động tốt. Bạn có sử dụng tự động hóa không? – streem

+0

Không bao giờ sử dụng các số ma thuật như thế này ('20.0f'). Nhận chiều cao thanh trạng thái trực tiếp. Chiều cao thanh trạng thái đã thay đổi đối với iPhone X, ví dụ hoặc thay đổi trên các thiết bị cũ trong khi gọi điện thoại đến '40.0f' – Dermot

1

nó có thể liên quan đến contentSize không làm việc trừ khi đặt trong VCs

- (void)viewDidLayoutSubviews 
{ 
    self.scrollView.contentSize = whatever 
} 

chỉ nói rằng bạn có thể đập đầu vào tường sai