2013-11-20 11 views
11

Mam UINavigationController w mojej aplikacji. UINavigationBar jest ustawiony na nieprzezroczysty i wszystkie widoki przewijania nie zachodzą na siebie pod paskiem. W poniższym widoku mam UITableView. Ramka UITableView jest (0 0; 320 504) na moim iPhonie 5. tj. Wysokość to 568 - 64 (wysokość paska nawigacji i paska stanu).iOS7 UIRefreshControl zmienia contentInset

Numer contentInset z UITableView to (0, 0, 0, 0). Po pierwszym załadowaniu tabeli contentOffset jest (0, 0).

To jest w porządku. Działa wspaniale.

Dodałem UIRefreshControl do widoku tabeli. Działa to kilka razy, ale po kilkukrotnym wykonaniu odciągania do odświeżenia zawartość na górze zostaje "zablokowana" pod paskiem nawigacji.

Kiedy to się dzieje, sprawdzam numer contentInset i jest teraz (-60, 0, 0, 0).

Czy istnieje sposób, aby zatrzymać sterowanie UIRefreshControl przed zmianą contentInset?

+0

Usunięto moją odpowiedź, ponieważ już to wykluczyłeś. Dzwonisz na endRefreshing, jak zakładam? – jhilgert00

+0

Bez obaw. Tak, kiedy nazywam 'endRefreshing' na kontroli, znika. To działa dobrze kilka razy, ale potem się freaks i zmiany 'contentInset' ukrywa kilka górnych wierszy pod paskiem nawigacji. – Fogmeister

+0

Prawdopodobnie można uciec z resetowaniem ramki po odświeżeniu, ale nie powinieneś tego robić. – jhilgert00

Odpowiedz

6

Jest to prawdopodobnie powód, dla którego UIRefreshControl jest obecnie obsługiwany tylko na UITableViewController, a nie przez dodanie do dowolnego przewijania (w wielu wypadkach można się z niego wydostać).

Sterowanie odświeżaniem działa magicznie, majstrując przy wstawianiu zawartości przewijania - szczególnie po zakończeniu odświeżania. Niestety kontroler widoku również majstruje z wstawkami zawartości przewijania, aby dopasować je pod półprzezroczystymi pasami nawigacji i stanu. Zabawa wynika. Czy jest to również problem w systemie iOS 6 (lub "dobrym starym iOS6", jak to nazwałem w przypadku tego samego problemu).

Najszybszym rozwiązaniem jest prawdopodobnie dodanie widoku tabeli jako elementu podrzędnego UITableViewController zamiast prostego podglądu. Myślę, że UITableViewController zarządza wstawkami dla ciebie na końcu odświeżania. Jeśli to nie zadziała, mam obejścia tego problemu, ale będzie musiał poczekać, aż wrócę do biura.

+1

Wydaje mi się, że naprawiłem to teraz. Zdałem sobie sprawę, że 'completionBlock' z' NSOperation' jest wywoływana w tym samym wątku, co operacja. To tutaj nazwałem 'endRefreshing'. Wysłałem to do głównego wątku i działa teraz bez zmiany "contentInset". Czy masz link do czegokolwiek na temat 'UIRefreshControl' tylko oficjalnie obsługuje' UITVC'? – Fogmeister

+0

Dokumenty mówią, że ma zostać przypisany do UITVC. AddSubview: rzecz jest wymieniona tylko na SO, nigdy w dokumentach. – jrturton

+0

Zobacz komentarz Dave DeLong na temat tej odpowiedzi: http://stackoverflow.com/a/12502450/852828 – jrturton

3

Zresetuj zawartość widoku tabeliZestaw.

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

Trzeba zastąpić setContentInset: w ty UICollectionView

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

Adres URL, o którym wspomniałeś, już nie istnieje – Nagarjun

6

dodam tę odpowiedź tutaj w przypadku ktoś ma problemy z UIRefreshControl zmieniając właściwości sterujące (nadany tytuł, odcień, etc .. .):

Nie zadzieraj z UIRefreshControl na -viewDidLoad:, zamiast tego użyj -viewDidAppear:.

+1

Upewnij się, że umieścisz warunek, jeśli (! RefreshControl) za każdym razem, gdy pojawi się twoja strona, dodasz do niego refreshcontrol. – George

+0

Naprawiono problem dzięki. –

Powiązane problemy