2012-04-06 2 views
6

У меня есть табличный вид, который автоматически прокручивается в моем приложении iPad (OS X 10.7.3, Xcode 4.3.2) и не уверен, где искать причину. Вот ситуация:UITableView автоматически прокручивается после reloadData

UITableView заполняет весь экран, и большинство ячеек являются фиксированными ячейками высоты. Единственное исключение - это ячейка, которая содержит UITextView и имеет динамическую высоту (или, другими словами, высота ячейки регулируется в соответствии с количеством текста).

Проблема проявляется, если таблица столкнулась с тем, что ячейка динамической высоты будет обрезана, когда вид таблицы находится наверху. Когда представление сначала загружается, таблица рисуется как обычно, только видимая часть ячейки UITextView. Однако, если я показываю UIPopoverController, мне нужно сделать reloadData после отклонения popover, и когда я это сделаю, представление таблицы будет прокручиваться вниз настолько, чтобы показать весь UITextView. (Не соответствует ячейке, содержащей UITextView, только UITextView. Таблица представляет собой сгруппированную таблицу, а ячейка UITextView является единственной ячейкой в ​​этом разделе, поэтому округленный нижний край по-прежнему не отображается после этого фантомного прокрутки.)

Я не вижу никакого кода в своем приложении, которое прокручивает представление таблицы или устанавливает смещение содержимого, поэтому я совершенно смущен относительно того, что может быть причиной этого.

Чтобы попытаться сузить его, я настроил свое представление, чтобы почтить UIScrollViewDelegate, и если я положу точку останова в методе scrollViewDidScroll: программа действительно остановится после того, как popover уйдет и даст мне следующую обратную трассировку :

(lldb) bt 
* thread #1: tid = 0x1f03, 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143, stop reason = breakpoint 3.1 
    frame #0: 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143 
    frame #1: 0x017e3494 UIKit`-[UIScrollView setContentOffset:] + 521 
    frame #2: 0x0180804d UIKit`-[UITableView setContentOffset:] + 334 
    frame #3: 0x017d495e UIKit`-[UIScrollViewScrollAnimation setProgress:] + 523 
    frame #4: 0x0183d234 UIKit`-[UIAnimator(Static) _advance:] + 255 
    frame #5: 0x02c013a3 GraphicsServices`HeartbeatTimerCallback + 35 
    frame #6: 0x023278c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 
    frame #7: 0x02328e74 CoreFoundation`__CFRunLoopDoTimer + 1220 
    frame #8: 0x022852c9 CoreFoundation`__CFRunLoopRun + 1817 
    frame #9: 0x02284840 CoreFoundation`CFRunLoopRunSpecific + 208 
    frame #10: 0x02284761 CoreFoundation`CFRunLoopRunInMode + 97 
    frame #11: 0x02bfe1c4 GraphicsServices`GSEventRunModal + 217 
    frame #12: 0x02bfe289 GraphicsServices`GSEventRun + 115 
    frame #13: 0x017a4c93 UIKit`UIApplicationMain + 1160 
    frame #14: 0x0000263d MyApp`main + 125 at main.m:14 

И если я распечатать Scrollview в этом методе, он показывает, что UITableView находится в движении (не уверен, где contentOffset исходит от):

Printing description of scrollView: 
<UITableView: 0xc3ed400; frame = (0 99; 383 817); clipsToBounds = YES; 
autoresize = W+RM+H; layer = <CALayer: 0x7bf1a40>; contentOffset: {0, 14}> 

Этот фантом прокруткой показывает на устройстве и симуляторе, и в iOS 4.3, 5.0 и 5.1. У кого-нибудь есть идеи?

+1

У меня есть смутное воспоминание об этом. Поскольку UITableViews является подклассом UIScrollView, а также UITextViews, он может все запутать. Возможно, попробуйте изменить некоторые свойства TextView перед перезагрузкой, например, отключить прокрутку? – GregularExpressions

+0

Вы правы, отключив прокрутку в текстовом представлении до того, как reloadData сохранила фантомный свиток. Если вы опубликуете свой комментарий в качестве ответа, я соглашусь с ним. Благодарю. –

ответ

1

У меня есть смутное воспоминание о том, что вы слышали об этом раньше. Поскольку UITableViews являются подклассом UIScrollView, а также UITextViews, он может все запутаться.

Возможно, при попытке изменить некоторые свойства TextView перед перезагрузкой, например, отключение прокрутки?

[myTextView setScrollEnabled:NO]; 
1

Когда UITextView becomesFirstResponder (как ИО 3 я считаю), если он находится внутри UIScrollView/UITableViewController, что Scrollview будет прокручиваться автоматически прошивкой, чтобы убедиться, что UITextView видна.

Для временного решения, взглянуть на: Disable UIScrollView scrolling when UITextField becomes first responder

0

Я подклассы в UIScrollView подкласс (в моем случае подклассы UITextField) и убедиться, что я не принимаю «произвольные» содержание коррекций:

override var contentOffset: CGPoint { 
    set { 
     let maxContentOffsetY = max(self.contentSize.height - self.frame.size.height, 0.0) 
     super.contentOffset.y = min(newValue.y, maxContentOffsetY) 
    } 
    get { 
     return super.contentOffset 
    } 
} 
Смежные вопросы