2012-10-31 17 views
5

Tôi có một số UITableView lớn hơn self.view. Tôi có một số UITextField ở cuối chế độ xem và tôi sử dụng phương thức ủy quyền – textFieldDidBeginEditing: để di chuyển chế độ xem lên khi trường văn bản bắt đầu chỉnh sửa.Đặt nội dung UITableViewTắt, sau đó kéo, xem chuyển đổi bù trừ sang vị trí mới

Điều này làm việc tốt, nhưng nếu tôi cố gắng cuộn chế độ xem trong khi UITextField đang được chỉnh sửa (và nội dung đã được bù đắp) thì nội dung sẽ chuyển xuống vị trí 'thích hợp' ở dưới cùng cho chế độ xem. Nói cách khác, contentOffset.y Tôi đặt được thay đổi bằng với kích thước của chế độ xem nội dung (như bạn mong đợi đối với hành vi thông thường).

Mọi ý tưởng về cách vượt qua hành vi này trong khi chỉnh sửa?

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    // Scroll to the currently editing text field 
    [self scrollViewToTextField:textField]; 

} 

- (void)scrollViewToTextField:(id)textField 
{ 
    // Set the current _scrollOffset, so we can return the user after editing 
    _scrollOffsetY = self.tableView.contentOffset.y; 

    // Get a pointer to the text field's cell 
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview]; 

    // Get the text fields location 
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView]; 

    // Scroll to cell 
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES]; 
} 

Trả lời

12

Cách tránh hành vi này là áp dụng contentInset cùng một lúc. Vì vậy, cho ví dụ trên:

- (void)scrollViewToTextField:(id)textField 
{ 
    // Set the current _scrollOffset, so we can return the user after editing 
    _scrollOffsetY = self.tableView.contentOffset.y; 

    // Get a pointer to the text field's cell 
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview]; 

    // Get the text fields location 
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView]; 

    // Scroll to cell 
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES]; 

    // Add some padding at the bottom to 'trick' the scrollView. 
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, point.y - 60, 0)]; 
} 

Sau đó, hãy chắc chắn để thiết lập lại các hình chữ nhật sau khi chỉnh sửa:

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 
} 

Thông báo trước của phương pháp này là bạn sẽ phải thực hiện một số kiểm tra trong phương pháp - (void)scrollViewDidScroll:(UIScrollView *)scrollView để hãy kiểm tra xem trường văn bản của bạn có đang ở chế độ xem không.

Cách thay thế này là tắt tính năng cuộn khi chỉnh sửa bắt đầu và có thể cuộn lại khi quá trình chỉnh sửa kết thúc. Bạn sẽ phải quyết định xem hành động này có tệ với UX trong ứng dụng của bạn hay không.

1

Tôi muốn thêm rằng nếu bạn đang sử dụng trường nhập văn bản. Và cần phải di chuyển sau đó áp dụng một firstResponder rằng việc áp dụng một EdgeInset sử dụng:

[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:YES]; 
[self.tableView setContentInset:UIEdgeInsetsZero]; 

Sau khi dừng cuộn tự động điều đó xảy ra với các lĩnh vực đầu vào trong UITableView khi họ nhận được tập trung. Cảm ơn @squarefrog