2013-11-20 25 views
11

Ich habe eine UINavigationController in meiner App. Die UINavigationBar ist auf opak eingestellt und alle Bildlaufansichten überlappen sich nicht unterhalb der Leiste. In einer Ansicht habe ich eine UITableView. Der Rahmen der UITableView ist (0 0; 320 504) auf meinem iPhone 5., d. H. Die Höhe ist 568 - 64 (die Höhe der Navigationsleiste und Statusleiste).iOS7 UIRefreshControl ändert contentInset

Die contentInset der UITableView ist (0, 0, 0, 0). Wenn die Tabellenansicht zuerst geladen wird, lautet die contentOffset(0, 0).

Das ist in Ordnung. Funktioniert hervorragend.

Ich habe eine UIRefreshControl zur Tabellenansicht hinzugefügt. Dies funktioniert ein paar Mal, aber nach ein paar Mal ziehen zu aktualisieren, dann wird der Inhalt an der Spitze "stecken" unter der Navigationsleiste.

Wenn dies passiert, überprüfe ich die contentInset und es ist jetzt (-60, 0, 0, 0).

Gibt es eine Möglichkeit, den UIRefreshControl davon abzuhalten, die contentInset zu ändern?

+0

Meine Antwort wurde entfernt, da Sie es offensichtlich bereits ausgeschlossen haben. Du rufst endRefreshing an, nehme ich an? – jhilgert00

+0

Keine Sorge. Ja, wenn ich 'endRefreshing' auf dem Steuerelement anrufe, verschwindet es. Dies funktioniert ein paar Mal gut, aber dann flippt es aus und das 'contentInset' ändert die oberen Zeilen der Navigationsleiste. – Fogmeister

+0

Sie könnten wahrscheinlich mit dem Zurücksetzen Ihres Frames nach der Aktualisierung davonkommen, aber das sollte nicht sein. – jhilgert00

Antwort

6

Dies ist wahrscheinlich der Grund, warum UIRefreshControl derzeit nur auf UITableViewController unterstützt wird, anstatt durch Hinzufügen zu einer Scrollview (die Sie in vielen Fällen erhalten können).

Das Refresh-Steuerelement macht seine Magie, indem es mit den Inhaltseinfügungen des scrollview bastelt - besonders wenn es auffrischt. Leider manipuliert der View-Controller auch die Inhaltseinfügungen der Bildlaufansicht, um sie unter die durchscheinenden Navigations- und Statusleisten zu bringen. Spaß ergibt sich. Ist das auch ein Problem auf iOS 6 (oder "gutes altes iOS6", wie ich es bei dem gleichen Problem nannte)?

Die schnellste Lösung ist wahrscheinlich, Ihre Tabellenansicht als Kind UITableViewController anstelle einer einfachen Unteransicht hinzuzufügen. Ich denke, dass UITableViewController die Einsätze für Sie am Ende der Aktualisierung verwaltet. Wenn das nicht funktioniert, habe ich eine Lösung, aber es muss warten, bis ich wieder im Büro bin.

+1

Ich habe das jetzt behoben. Ich erkannte, dass der 'completionBlock' von' NSOperation' im selben Thread wie die Operation aufgerufen wird. Hier nannte ich 'endRefreshing'. Ich habe dies an den Hauptthread geschickt und es funktioniert jetzt, ohne das 'contentInset' zu ändern. Haben Sie einen Link zu irgendetwas über 'UIRefreshControl', das nur offiziell' UITVC' unterstützt? – Fogmeister

+0

Die Dokumentation besagt, dass sie einer UITVC zugewiesen wurde. Das addSubview: Ding wird nur auf SO erwähnt, nie in den Dokumenten. – jrturton

+0

Siehe Dave DeLongs Kommentar zu dieser Antwort: http://StackOverflow.com/a/12502450/852828 – jrturton

3

Setzen Sie Ihre Tabellenansicht contentInset zurück.

-(void)pullToRefresh 
{ 
    [self.tableView reloadData]; 
    [self.refreshControl endRefreshing]; 
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 
} 
2

Sie benötigen setContentInset außer Kraft setzen: in Ihnen

- (void)setContentInset:(UIEdgeInsets)contentInset { 
    if (self.tracking) { 
    CGFloat difference = contentInset.top - self.contentInset.top; 
    CGPoint translation = [self.panGestureRecognizer translationInView:self]; 
    translation.y -= difference * 3.0/2.0; 
    [self.panGestureRecognizer setTranslation:translation inView:self]; 
    } 
    [super setContentInset:contentInset]; 
} 
+0

URL, die Sie erwähnt haben, existiert nicht mehr – Nagarjun

6

UICollectionView werde ich diese Antwort hier hinzufügen, falls jemand Probleme mit UIRefreshControl durch Änderung der Steuereigenschaften (attributed Titel, Farbton, etc .. hat .):

Verwechseln Sie nicht die UIRefreshControl auf -viewDidLoad:, verwenden Sie stattdessen -viewDidAppear:.

+1

Stellen Sie sicher, dass Sie eine Bedingung if (! RefreshControl) einfügen, sonst jedes Mal, wenn Ihre Seite erscheint, fügen Sie ihr eine Refreshsteuerung hinzu. – George

+0

Mein Problem behoben, danke. –

Verwandte Themen