2013-10-25 9 views
14

Mam dziwne problemy z metodą topLayoutGuide, które muszę użyć w sytuacji, gdy setAutomaticallyAdjustsScrollViewInsets: nie działa. Aby zawęzić przyczynę problemu, utworzyłem następujący minimalny przykład, który po prostu konfiguruje podstawowy widok tabeli do testowania:Wywołanie topLayoutGuide przerywa przewijanie w ogóle?

  1. Skonfiguruj nową aplikację pojedynczego widoku iOS w Xcode.
  2. Wklej następujący kod w realizacji ViewController.m za:

    @implementation ViewController 
    
    - (void)loadView 
    { 
        [self setTableView:[[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]]; 
    } 
    
    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        [self setAutomaticallyAdjustsScrollViewInsets:NO]; // [*] 
    } 
    
    - (void)viewDidLayoutSubviews 
    { 
        UITableView *tableView = [self tableView]; 
    
        UIEdgeInsets insets = [tableView contentInset]; 
        // insets.top = [[self topLayoutGuide] length]; // [1] 
        // insets.top = 100;       // [2] 
    
        [tableView setContentInset:insets]; 
        [tableView setScrollIndicatorInsets:insets]; 
    } 
    
    #pragma mark - Table view data source 
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
        return 100; 
    } 
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        static NSString *CellIdentifier = @"Cell"; 
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    
        if (cell == nil) { 
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
        } 
    
        [[cell textLabel] setText:[NSString stringWithFormat:@"%d", [indexPath row]]]; 
    
        return cell; 
    } 
    
    @end 
    

Kwestie, które mam są takie:

  1. Gdybym odkomentuj linię oznaczoną [1], poprawna wstawka jest stosowana, ale przewijanie widoku tabeli już nie działa. Kiedy próbuję przewinąć, stół po prostu odskakuje z powrotem do początkowej pozycji przewijania po tym, jak puściłem palec. To zachowanie jest również wywoływane przez zwykłe wywołanie [self topLayoutGuide], bez przypisywania wyniku do niczego.

  2. Gdybym odkomentuj linię [2]zamiast z [1], przewijanie utworów. Stosuje się również wstawkę o wartości 100 pt. Ale teraz początkowa pozycja przewijania jest automatycznie dostosowywana, tak aby zawartość przewyższała pasek stanu.

([*]: rzeczywiście wydaje się to tylko zrobić wszystko, w połączeniu z kontrolerem nawigacyjnym zawierającym I nie wydaje się, aby dokonać zmian w tym przykładzie, ale chcę, aby wyłączyć wszystkie automatyczne zachowanie tylko aby się upewnić. .)

Czy jest coś oczywistego, że robię źle? Naprawdę jestem tu zagubiona.

+4

Właśnie się dowiedziałem, że wywołanie '[self topLayoutGuide]' powoduje 'własność contentSize' widoku tabeli, aby zmienić od popraw wartość do '{0, 0}'. Nie mam pojęcia, dlaczego tak się dzieje, choć ... – tajmahal

+2

Prawdopodobnie błąd, również ten. – cschwarz

+2

To samo tutaj. To jest bardzo frustrujące. Czuje się jak dobry stary iOS 3.0 razy. – Nicky

Odpowiedz

11

Jest to z pewnością błąd w systemie iOS 7 (nie wydaje się być naprawiony w wersji 7.1), ale wydaje się wpływać tylko na UITableViewControllers. Przełączyłem się na używanie UIViewController z wbudowanym UITableView, ponieważ nie używam komórek statycznych i nie potrzebuję żadnej "magii" jaką daje ci UITableViewController.

Po ręcznym podłączeniu UITableViewDataSource i UITableViewDelegate udało mi się rozpocząć korzystanie z self.topLayoutGuide bez komplikowania zawartości contentView tableView.

Było to dopuszczalne rozwiązanie, dopóki Apple nie naprawi błędu.

2

samo do mnie, zamiast się topLayoutGuide, spróbuj tego:

CGFloat topOffset = CGRectGetMaxY(self.refController.navigationController.navigationBar.frame);