2012-10-31 18 views
5

'dan biraz daha büyük olan self.view'dan daha büyük. Görünümün altında bir UITextField var ve metin alanı düzenlemeye başladığında görünümü yukarı taşımak için delegate yöntemini – textFieldDidBeginEditing: kullanıyorum.UITableView contentOffset'i ayarladıktan sonra sürükleyin, ofset atlamalarını yeni konuma getirin

Bu, iyi çalışır, ancak UITextField düzenlenirken (ve içeriğin zaten kaydırıldığı) görünümü kaydırmaya çalışırsam, içerik görünüm için en alttaki 'uygun' konuma geçer. Başka bir deyişle, contentOffset.y I ayarının içerik görünümünün boyutuna eşit olacak şekilde değiştirilmesi (normal davranış için beklediğiniz gibi).

Düzenleme yaparken bu davranışı nasıl aşacağınız hakkında herhangi bir fikrin var mı?

- (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]; 
} 

cevap

12

Bu davranışı önlemek için bir yol, aynı zamanda contentInset uygulamaktır. Yani yukarıdaki örneğin:

- (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)]; 
} 

Sonra düzenlemeden sonra iç metnini sıfırlamak emin olun:

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

bu yaklaşımın ihtar etmek - (void)scrollViewDidScroll:(UIScrollView *)scrollView yönteminde bazı kontroller uygulamak gerekecek olmasıdır Metin alanınızın hala kontrol edildiğini kontrol edin.

Bunun alternatifi, düzenleme başladığında kaydırma işlemini devre dışı bırakmak ve kaydırma işlemini sona erdiğinde yeniden etkinleştirmektir. Bu eylemin uygulamanızda UX için kötü olup olmadığına karar vermelisiniz.

1

Giriş metin alanları kullanıyorsanız bunu eklemek isterim. Ve sonra kaydırma kullanarak bir EdgeInset uygulayarak bir firstResponder uygulamak gerekir:

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

sonra durur onlar odağı olsun UITableView içinde giriş alanları ile olur otomatik kaydırma. Teşekkürler @squarefrog