2009-06-12 4 views
25

Ich habe ein UITableView, dessen Datenquelle und Delegat zwischen einigen benutzerdefinierten Datenquellenobjekten umgeschaltet werden, wenn der Benutzer ein segmentiertes Steuerelement berührt (denken Sie an "Top Paid "vs" Top Free "in der App Store App).Programmgesteuertes Erzwingen eines UIScrollView-Scrollens zum Freigeben einer Tabellenansicht mit mehreren Datenquellen

Jedes Datenquellenobjekt speichert seinen letzten Scroll-Inhalt versetzt, und stellt sich wieder her, wenn es die aktive Datenquelle für die View-Tabelle wird, indem Sie:

tableView.contentOffset = CGPointMake(0, savedScrollPosition); 

Das funktioniert gut, wenn der Benutzer die Datenquelle schaltet, wenn Die Tabelle befindet sich im Ruhezustand. Wenn der Benutzer jedoch das segmentierte Steuerelement anspricht, während sich die Tabelle noch bewegt (dh verlangsamt), wird die Tabellenansicht weiterhin vom alten Offset abgebremst und überschreibt so effektiv meine contentOffset-Zuweisung.

Gibt es eine Möglichkeit zu erzwingen, die Tabellenansicht zu stoppen Scrollen/Verlangsamen, wenn ich den ContentOffset oder eine andere Möglichkeit, um diese Art von schaltbaren Datenquellen-Tabellenansicht funktionieren arbeiten lassen?

Antwort

19

Haben Sie diese 2 Methoden versucht?

Sie gelten tatsächlich für das "Scrollen" nicht nur den Offset des Inhalts.

[self.tableView scrollToRowAtIndexPath:savedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

OR:

[self.tableView scrollRectToVisible:savedFrame animated:NO]; 

Sie sollten eigentlich das Scrollen bewirken und durch die Erweiterung der Beschleunigung des Tisches, nicht nur, was auf dem Bildschirm sichtbar ist.

+2

scrollRectToVisible hat es getan, wobei die gespeicherte Bildlaufposition als Ursprung des Rect verwendet wurde und die Grenzen der Tabellenansicht als Höhe verwendet wurden. Sie sind absolut richtig, dass die scroll * -Methoden die Beschleunigung so steuern, dass der Inhalts-Offset nicht gesetzt wird. –

+0

'scrollRectToVisible' hat auch für mich funktioniert. – zekel

-3

könnten Sie versuchen,

tableView.scrollEnabled = NO; 
tableView.scrollEnabled = YES; 

tun Dies könnte die Scroll stoppen, indem sie zu deaktivieren, dann lassen Sie es erneut. Ich habe das nicht speziell versucht, aber ich habe ähnliche Dinge getan.

+0

Ich habe versucht, es zu NO Einstellung Setzen Sie dann contentOffset und setzen Sie es auf YES zurück. Das hat nicht funktioniert, aber ich könnte genauso gut die Sequenz NO-YES-offset versuchen und sehen, ob das einen Unterschied macht. –

0

Sie könnten warten, bis die "verlangsamende" Eigenschaft zu NEIN wird (z. B. durch Verwendung von KVO) und danach umschalten.

+0

Das Problem dabei ist, dass es eine ziemlich merkbare Verzögerung geben würde, bevor die Bildlaufposition eingestellt werden kann. –

13

Haben Sie versucht, [view setContentOffset: offset animated: YES] zu verwenden?

+0

Ich werde es versuchen. Es ist nicht genau das Verhalten, das ich will (Ich möchte die Scroll-Position sofort schnappen), aber es könnte gut genug sein. –

+8

Das funktionierte für mich, mit animierten: Nein. –

+0

animiert hat es – Eugene

0

Eine offensichtliche Arbeit besteht darin, zwei separate Tabellenansichten zu haben, die ausgelagert werden, und jede Datenquelle ist permanent mit einer der Tabellenansichten verbunden. Das schien mir nur eine Verschwendung von Erinnerung zu sein, aber vielleicht denke ich darüber nach.

2

Ich verwendete Coreys Ansatz. Ich speichere & die Rects mit der Wörterbuchdarstellung wiederherstellen. Auch kann es nicht offensichtlich, aber die rect & wiederherstellen zu bewahren ist die Grenzen des UITableView:

// Save the current tableview bounds 
CGRect contentRect = self.listTableView.bounds; 
if (!!oldScope) [_contentRects setObject:(NSObject *)CGRectCreateDictionaryRepresentation(contentRect) forKey:oldScope]; 

// Restore if possible 
CFDictionaryRef restoredFrameDict = (CFDictionaryRef)[_contentRects objectForKey:newScope]; 
if (!restoredFrameDict) restoredFrameDict = CGRectCreateDictionaryRepresentation(CGRectZero); 
CGRectMakeWithDictionaryRepresentation(restoredFrameDict, &contentRect); 

// Switch over to new datasource 
self.listTableView.dataSource = [self dataSourceForScope:newScope]; 
[self.listTableView reloadData]; 

// Restore content offset for "newScope"; Also stops scrolling 
[self.listTableView scrollRectToVisible:contentRect animated:NO]; 

Notiere die austauschbare Verwendung von CFDictionaryRef und NSDictionary *

4

einfach diese Suche einen Weg gefunden, Stoppen Sie mein UIScrollView - ich musste einige Subviews bewegen, aber das sah nicht richtig aus, wenn der Benutzer den Bildschirm gedreht hatte und es immer noch verlangsamte.

Wie auch immer - scrollRectToVisible hat nicht für mich funktioniert (vielleicht weil ich nicht eine Tabellenansicht verwenden ??) aber das hat perfekt funktioniert:

Ich kann dann die Subview Sachen ohne Sorgen machen!

0

Es war mein Problem, wenn ich einen UISwitch als Selektor für die Tabellen hatte. Aber mit der segmentierten Steuerung habe ich kein Problem. Vielleicht hast du den Tisch nicht nachgeladen? Das ist mein Stück Arbeits Code:

NSIndexPath *exPath = [[subTable indexPathsForVisibleRows] lastObject]; 

isMatchOn = [whatList selectedSegmentIndex] == 0 ? YES : NO; //table source will make the choice looking at this BOOL 

[subTable reloadData]; // here tables actually flip 

if (lastPosition) { 
    [subTable scrollToRowAtIndexPath:lastPosition atScrollPosition:UITableViewScrollPositionBottom animated:NO]; //I scroll to saved index 
    } 
self.lastPosition = exPath; //here I save the current position 
5

Das ist für mich gut gearbeitet:

if (self.tableView.isDecelerating) { 
     NSArray *paths = [self.tableView indexPathsForVisibleRows]; 
     [self.tableView scrollToRowAtIndexPath:[paths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

    } 
0

Sie auch self.tableView.isScrollEnabled = true/false tun können, wenn Sie zu einem bestimmten tableView.contentOffset.y Wert erhalten

Verwandte Themen