2012-03-09 3 views
43

Я использую пользовательский UITableViewCell s внутри моего UITableView. Каждый из них UITableViewCell s довольно высокий и содержит UITextField наверху.Отключение автоматической прокрутки UITableView при редактировании UITextField внутри UITableViewCell

Когда пользователь отбирает UITextField, чтобы отредактировать его, появится клавиатура, и UITableView прокручивается автоматически, чтобы ячейка находилась в верхней части экрана.

Проблема в том, что это прокручивает UITableView до нижней части UITableViewCell, а не сверху. Когда UITableViewCell высокий и отредактированный, UITextField находится наверху, так что вы не можете видеть UITextField. Я знаю, как программно прокручивать UITableView, но я просто не знаю, как отключить эту автоматическую прокрутку, чтобы я мог прокрутить UITableView самостоятельно. Как я могу это сделать?

+0

Вы понимаете это? Запуск в ту же проблему. –

+0

@SteveBaughman вы нашли решение? – HighFlyer

+0

nope :(Я фактически прекратил использовать табличное представление из-за этого и некоторые другие причины ...:/ –

ответ

59

Функция autoscroll находится в функциональности UITableViewController.

Чтобы отключить автоматическую прокрутку я нашел два способа:

  1. использовать вместо UITableViewController просто UIViewController - установить источник данных и делегат по своему усмотрению.
  2. Переопределить метод viewWillAppear и не называет [super viewWillAppear: animated]

С оба решением отключить не только Автопрокрутку, но и некоторые другие приятные, но не существенные признаки, которые описаны в обзоре класса Apple's ссылка:

https://developer.apple.com/documentation/uikit/uitableviewcontroller

+3

У меня была та же проблема, и решение 2 работало. Я тестировал это в iOS 5.0.0 и выше, и он держится до сих пор (текущая версия - 6.1.2). 't ручаться за него в 4, но эй, это 2013 год, поэтому мы, вероятно, можем сказать, что 5.0 является самой низкой поддержкой os прямо сейчас. – Cocoadelica

+0

Проблема в том, что вставки не приспособлены для размещения клавиатуры, по крайней мере, не в iOS 7.0. 6. Это означает, что для этого потребуется больше кода, чтобы сделать это вручную: ловить клавиатурные уведомления, ... Ужасно. –

+0

Вариант 2 работал со мной. Спасибо –

-2

Вы пытались установить для свойства "scrollsToTop" значение tableview для NO. По умолчанию это ДА.

+0

попробовал еще, но это не сработало ... scrollToTop doesn ' t обработайте это ... спасибо за ответ в любом случае! –

-4

Вы можете попробовать сделать следующее:

self.tableView.scrollEnabled = NO; 

Это должно отключить прокрутку в представлении таблицы.

+1

Это не мешает автоматическая прокрутка UITableViewController выполняется при нажатии на текстовое поле в UITableViewCell – Gujamin

3

Вы можете сделать следующее:

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

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

- (void)unregisterForKeyboardNotifications 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    self.tableView.scrollEnabled = NO; 
} 

- (void)keyboardDidShow:(NSNotification *)notification 
{ 
    double delayInSeconds = 0.3; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      self.tableView.scrollEnabled = YES; 
    }); 
} 

Затем реализовать этот метод UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (! self.tableView.scrollEnabled) 
     [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
} 

!!! Но будьте осторожны, если пользователь ударит по местоположению в UITextField, который будет закрыт клавиатурой, тогда он не будет прокручиваться.

С моей точки зрения, самое лучшее, что нужно сделать, это убедиться, что все ячейки сверху до одного с включенным UITextField будут видны, когда будет отображаться клавиатура.

+0

Вы - человек искусства. Спасибо, работал. –

+0

-scrollViewDidScroll: действительно вызывается, когда происходит автоматическая прокрутка, это лучшее решение. –

6

Определение свойств для UITableViewController:

@property (nonatomic) BOOL scrollDisabled; 
@property (nonatomic) CGFloat lastContentOffsetY; 

Перед тем, как позвонить becomeFirstResponder:

// Save the table view's y content offset 
lastContentOffsetY = tableViewController.tableView.contentOffset.y; 
// Enable scrollDisabled 
scrollDisabled = YES; 

Добавьте следующий код в таблице контроллера представления:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (self.scrollDisabled) { 
     [self.tableView setContentOffset:CGPointMake(0, lastContentOffsetY)]; 
    } 
    ... 
} 

После вызова resignFirstResponder, с et scrollDisabled = NO.

+0

Это не проблема с прокруткой, это класс tableViewController. Правильным ответом было переопределение viewWilAppear –

1

Проблема для меня не столько в том, что она прокручивалась, а в том, что редактирование текста редактировалось с экрана.

Так вместо того, чтобы предотвратить скроллинг, я просто rescroll в TableView туда, где я хочу, когда редактирование срабатывает, как это:

public func textViewShouldBeginEditing(textView: UITextView) -> Bool {    
    dispatch_async(dispatch_get_main_queue()) { 
    tableViewController.tableView.scrollToRowAtIndexPath(self.indexPath!, atScrollPosition: UITableViewScrollPosition.Middle, animated: true) 
    } 
    return true 
} 
1

К сожалению, перекрывая -viewWillAppear: не работает для меня в прошивкой 8.

Вот мое решение (как в реализации UITableViewController):

- (void)viewDidLoad { 

[super viewDidLoad]; 

[[NSNotificationCenter defaultCenter] removeObserver:self.tableView name:UIKeyboardWillShowNotification object:nil]; 

[[NSNotificationCenter defaultCenter] removeObserver:self.tableView name:UIKeyboardWillHideNotification object:nil]; 
} 

поскольку автоматическая прокрутка поведение вызывается шоу UIKeyboard в/скрывать уведомления, поэтому просто НЕ наблюдайте их.

+0

- это все еще работает для вас? Не удается заставить его работать в iOS 11/Xcode 9 – simonthumper

1

Лучший способ заключается в подклассе UITableView, а затем переопределить setContentOffset(_ contentOffset: CGPoint, animated: Bool) и не звонить super.setContentOffset(_ contentOffset: CGPoint, animated: Bool). В этом методе контроллер просмотра выполняет автоматический прокрутки.

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) 
{ 
    //Do nothing 
} 
Смежные вопросы