2012-10-16 15 views
6

Ich habe eine UITableView erstellt, die ich unter meiner halbtransparenten schwarzen Statusleiste scrollen möchte. In meiner XIB stelle ich die y-Position der Tabellenansicht auf -20 und alles sieht gut aus.UITableView mit UIRefreshControl unter einer halbtransparenten Statusleiste

Jetzt habe ich gerade ein iOS6 UIRefreshControl hinzugefügt, das funktioniert, funktioniert aber wegen der -20 Y-Position, es zieht sich hinter der Statusleiste. Ich hätte gerne, dass es "gestreckt" ist, um unter der Statusleiste statt hinter zu sein.

Es macht Sinn, warum es verpfuscht, aber es scheint keinen Unterschied zu geben, den Rahmen zu ändern, und die Inhaltseinfügungen der Tabellenansicht usw. machen keinen Unterschied.

Die Dokumentation schlägt vor, dass der UITableViewController, sobald das refreshControl gesetzt wurde, von nun an seine Position übernimmt.

Irgendwelche Ideen?

Antwort

0

UIRefreshControl sitzt immer über dem Inhalt in Ihrem UITableView. Wenn Sie ändern müssen, wo sich das refreshControl befindet, ändern Sie die Tabelle contentInset. Die UIRefreshControl berücksichtigt dies bei der Festlegung, wo sie positioniert werden soll.

+0

Ja, ich versuchte, dass. Es betrifft nur den Inhalt, nicht das Refresh-Steuerelement :( – NonatomicRetain

+0

Gleiches Problem hier mein UITableView hat einen Einsatz UIEdInSets inset = UIEdgeInsetsMake (37, 0, 0, 0); tblAccounts.contentInset = Einfügung; Aber das RefreshControl ignoriert den Inset – Andy

4

einfach die UIRefreshControl Unterklasse und überschreiben layoutSubviews wie folgt aus:

- (void)layoutSubviews 
{ 
    UIScrollView* parentScrollView = (UIScrollView*)[self superview]; 

    CGSize viewSize = parentScrollView.frame.size; 

    if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { 
     self.hidden = YES; 
    } else { 
     self.hidden = NO; 
    } 

    CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + 20; 

    self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); 

    [super layoutSubviews]; 
} 
+0

Dieser Code berücksichtigt nicht die Tatsache, dass 'UIRefreshControl' bewegt und erweitert wird, nicht nur einfach mit dem scrollView verschieben. –

+0

Ich habe einen Code hinzugefügt, um das anfängliche "Herunterziehen" zu berücksichtigen, jetzt wird es so aussehen, wie es sollte :). –

0

Try this:

CGFloat offset = 44; 
for (UIView *subview in [self subviews]) { 
    if ([subview isKindOfClass:NSClassFromString(@"_UIRefreshControlDefaultContentView")]) { 
     NSLog(@"Setting offset!"); 
     [subview setFrame:CGRectMake(subview.frame.origin.x, subview.frame.origin.y + offset, subview.frame.size.width, subview.frame.size.height)]; 
    } 
} 

Dies wird UIRefreshControll für 44 Punkte nach unten bewegen;

9

können Sie die UIRefreshControl Unterklasse und implementieren layoutSubviews wie so:

@implementation RefreshControl { 
    CGFloat topContentInset; 
    BOOL topContentInsetSaved; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // getting containing scrollView 
    UIScrollView *scrollView = (UIScrollView *)self.superview; 

    // saving present top contentInset, because it can be changed by refresh control 
    if (!topContentInsetSaved) { 
     topContentInset = scrollView.contentInset.top; 
     topContentInsetSaved = YES; 
    } 

    // saving own frame, that will be modified 
    CGRect newFrame = self.frame; 

    // if refresh control is fully or partially behind UINavigationBar 
    if (scrollView.contentOffset.y + topContentInset > -newFrame.size.height) { 
     // moving it with the rest of the content 
     newFrame.origin.y = -newFrame.size.height; 

    // if refresh control fully appeared 
    } else { 
     // keeping it at the same place 
     newFrame.origin.y = scrollView.contentOffset.y + topContentInset; 
    } 

    // applying new frame to the refresh control 
    self.frame = newFrame; 
} 

Es dauert contentInset Rechnung des Tableview, aber Sie können topContentInset Variable ändern, um den Wert, die Sie brauchen, und es wird den Rest erledigen.

Ich hoffe, der Code ist genug dokumentiert, um zu verstehen, wie es funktioniert.

+0

Funktioniert wie ein Charme. Danke Anthony! – George

1

Die current upvoted answer spielt nicht gut mit der Tatsache, dass Sie die Komponente herunterziehen (wie Anthony Dmitrijew wies darauf hin), ist der Offset falsch. Der letzte Teil soll es beheben.

So oder so: die UIRefreshControl mit folgenden Methode Unterklasse:

- (void)layoutSubviews 
{ 
    UIScrollView* parentScrollView = (UIScrollView*)[self superview]; 
    CGFloat extraOffset = parentScrollView.contentInset.top; 

    CGSize viewSize = parentScrollView.frame.size; 

    if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { 
     self.hidden = YES; 
    } else { 
     self.hidden = NO; 
    } 

    CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + extraOffset; 

    if(y > -60 && !self.isRefreshing){ 
     y = -60; 
    }else if(self.isRefreshing && y <30) 
    { 
     y = y-60; 
    } 
    else if(self.isRefreshing && y >=30) 
    { 
     y = (y-30) -y; 
    } 

    self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); 

    [super layoutSubviews]; 
} 
+0

Warum schreiben Sie diese Codezeile y = (y-30) -y; nach dem Öffnen der Klammern ist y = 30; Wie zu verstehen, sollte es y = y - 30 sein –

0

ich die übergeordneten der layoutSubviews in den anderen Antworten gefunden haben mehr als den Rahmen zu ändern, sie das Verhalten auch ändern (die Steuerung gestartet Schob runter mit dem Inhalt). Um den Rahmen zu ändern, aber nicht das Verhalten, das ich dies tat:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGRect frame = self.frame; 
    CGFloat desiredYOffset = 50.0f; 
    self.frame = CGRectMake(frame.origin.x, frame.origin.y + desiredYOffset, frame.size.width, frame.size.height); 

}

Verwandte Themen