2012-10-16 14 views
6

Stworzyłem UITableView, który chcę przewinąć pod moim półprzezroczystym czarnym paskiem stanu. W moim XIB, właśnie ustawiam pozycję y widoku tabeli na -20 i wszystko wygląda dobrze.UITableView z UIRefreshControl pod półprzezroczystym paskiem stanu

Właśnie dodałem narzędzie URefefreshControl z funkcją "odśwież i odśwież", które działa jednak z powodu pozycji -20 y, przeciąga zza paska stanu. Chciałbym, aby pozycja "rozciągnięta na" znajdowała się pod paskiem stanu, a nie za nim.

To ma sens, ponieważ jest zepsuty, ale nie ma żadnej różnicy w zmianie ramki, a wstawki zawartości tabeli itp. Nie mają znaczenia.

Dokumenty sugerują, że po ustawieniu refreshController, UITableViewController od tego momentu zajmuje się jego pozycją.

Wszelkie pomysły?

Odpowiedz

0

UIRefreshControl zawsze znajduje się powyżej zawartości w twoim UITableView. Jeśli chcesz zmienić miejsce, w którym znajduje się refreshControl, spróbuj zmienić top tableView na contentInset. UIRefreshControl bierze to pod uwagę przy ustalaniu, gdzie powinien być ustawiony.

+0

Tak próbowałem tego. Wpływa tylko treść, a nie kontrolę odświeżania :( – NonatomicRetain

+0

sam problem tutaj mój UITableView ma wstawka UIEdgeInsets wstawka = UIEdgeInsetsMake (37, 0, 0, 0); tblAccounts.contentInform = wstawka; Ale refreshControl ignoruje wstawkę – Andy

4

Wystarczy podklasy UIRefreshControl i zastąpić layoutSubviews takie jak ten:

- (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

Ten kod nie bierze pod uwagę faktu, że 'UIRefreshControl' porusza się i rozwija, a nie tylko porusza się za pomocą scrollView. –

+0

Dodałem kod, aby wziąć początkowe "ściągnięcie" na konto, teraz będzie ładnie wyglądało tak, jak powinno :). –

0

Spróbuj tego:

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)]; 
    } 
} 

Ten ruszy UIRefreshControll w dół do 44 punktów;

9

Można podklasy UIRefreshControl i wdrożenie layoutSubviews tak:

@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; 
} 

Zajmuje tableView na contentInset pod uwagę, ale można zmienić topContentInset zmienna wartość co trzeba i będzie obsługiwać resztę.

Mam nadzieję, że kod jest wystarczająco udokumentowany, aby zrozumieć, jak to działa.

+0

Działa jak urok. Dzięki Anthony! – George

1

Model current upvoted answer nie gra dobrze z tym, że wyłączyłeś komponent (jak zauważył Anthony Dmitrijew), przesunięcie jest nieprawidłowe. Ostatnia część to naprawić.

Tak czy inaczej: podklasy UIRefreshControl z następującą metodą:

- (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

Dlaczego piszesz ten wiersz kodu y = (y-30) -y; po otwarciu nawiasów będzie to y = 30; Jak rozumiemy, powinno to być y = y - 30 –

0

znalazłem Nadrzędnym z layoutsubviews w innych odpowiedzi nie więcej niż zmienić ramkę, ale także zmiany zachowania (kontrola rozpoczęła przesuwnych z treścią). Aby zmienić ramkę, ale nie zachowanie Zrobiłem to:

- (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); 

}

Powiązane problemy