2012-04-06 13 views
6

ich eine Tabellenansicht, die automatisch ein wenig in meinem iPad App nach unten scrollt (O X 10.7.3, Xcode 4.3.2) und nicht sicher, wo die Ursache zu suchen. Hier ist die Situation:UITableView automatisch nach unten scrollt nach einem reload

Die UITableView füllt den ganzen Bildschirm, und die meisten Zellen sind Zellen Höhe fixiert. Die einzige Ausnahme ist eine Zelle, die eine UITextView enthält und eine dynamische Höhe hat (dh die Höhe der Zelle passt sich an die Menge des Textes an).

Das Problem manifestiert sich, wenn die Tabelle den dynamischen Höhenzelle abgeschnitten haben passiert, wenn der Tisch Ansicht an der Spitze ist. Wenn die Ansicht zuerst geladen wird, wird die Tabelle als normal gezeichnet, wobei nur ein Teil der UITextView-Zelle sichtbar ist. Wenn ich jedoch einen UIPopoverController anzeige, muss ich ein reloadData nach dem Beenden des Popover ausführen, und wenn ich das tue, wird die Tabellenansicht gerade so weit herunterscrollen, dass alle UITextView angezeigt werden. (Nicht die Zelle des UITextView Geist enthält, die Sie, nur die UITextView. Die Tabelle ist eine gruppierte Tabelle und die UITextView Zelle ist die einzige Zelle in dem Abschnitt, so dass die abgerundete Unterkante ist nach dieser Phantom scroll noch nicht sichtbar.)

Ich kann in meiner App keinen Code sehen, der die Tabellenansicht scrollt oder einen Inhaltsoffset setzt, so dass ich total verwirrt bin, was das verursachen könnte.

Um zu versuchen, es zu verengen, richtete ich meine Ansicht zu Ehren der UIScrollViewDelegate, und wenn ich einen Haltepunkt in der scrollViewDidScroll: -Methode setzen, stoppt das Programm in der Tat nach dem Popover geht weg und gibt mir die folgende Backtrace :

(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 

Und wenn ich die Scrollview in diesem Verfahren auszudrucken, zeigt es, dass die UITableView in Bewegung ist (nicht sicher, wo die content~~POS=TRUNC herkommt):

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

Dieses Phantom Scrollen zeigt, auf dem Gerät und dem Simulator, und in iOS 4.3, 5.0 und 5.1. Hat jemand irgendwelche Ideen?

+1

Ich habe eine vage Erinnerung daran, dass ich vorher etwas darüber gehört habe. Da UITableViews eine UIScrollView-Unterklasse sind und UITextViews auch, kann dies alles durcheinander bringen. Versuchen Sie vielleicht, vor dem Neuladen einige Eigenschaften in der Textansicht zu ändern, z. B. das Scrollen zu deaktivieren. – GregularExpressions

+0

Sie haben Recht, indem Sie das Scrollen in der Textansicht deaktivieren, bevor die reloadData den Phantom-Scroll verhindert hat. Wenn Sie Ihren Kommentar als Antwort posten, werde ich ihn akzeptieren. Vielen Dank. –

Antwort

1

Ich habe eine vage Erinnerung an vor etwas über diese hören. Seit UITableViews sind eine UIScrollView Unterklasse und so sind UITextViews es kann alles durcheinander gebracht werden.

vielleicht an einer Vermutung versuchen, einige Eigenschaften auf der Textview ändern, bevor Nachladen, wie Scrollen deaktivieren?

[myTextView setScrollEnabled:NO]; 
0

I subclassed die UIScrollView Unterklasse (in meinem Fall subclassed UITextField) und stellen Sie sicher, dass ich nicht "willkürlich" Inhalt Offsets akzeptieren:

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 
    } 
} 
Verwandte Themen