У меня есть табличный вид, который автоматически прокручивается в моем приложении 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. У кого-нибудь есть идеи?
У меня есть смутное воспоминание об этом. Поскольку UITableViews является подклассом UIScrollView, а также UITextViews, он может все запутать. Возможно, попробуйте изменить некоторые свойства TextView перед перезагрузкой, например, отключить прокрутку? – GregularExpressions
Вы правы, отключив прокрутку в текстовом представлении до того, как reloadData сохранила фантомный свиток. Если вы опубликуете свой комментарий в качестве ответа, я соглашусь с ним. Благодарю. –