2017-07-21 41 views
9

Tak więc specyfikacja klienta chce, aby UITableView zawsze wyświetlał jeden z wierszy, aby użytkownik mógł wchodzić w interakcję z tym kluczowym przyciskiem w dowolnej pozycji UITableView. Po przewinięciu i zobaczeniu rzeczywistego Rzędu za pomocą przycisku, pływająca stopka musi zniknąć i pozwolić użytkownikowi na interakcję z "prawdziwą" komórką, a nie z pływającą wersją.UITableView niestandardowe duplikaty UIView

Doszedłem się z następującego kodu:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{  
    if([self isPostularmeRowVisible]) 
    { 
     [self hidePostularmeFooterView]; 
    } 
    else 
    { 
     [self showPostularmeFooterView]; 
    } 
} 

-(BOOL)isPostularmeRowVisible 
{   
    NSArray *indexes = [self.tableView indexPathsForVisibleRows]; 
    for (NSIndexPath *index in indexes) 
    { 
     if (index.row == 0 && index.section>=DetalleEmpleoPostularmeCell) 
     { 
      return YES; 
     } 
    } 
    return NO; 
} 

-(void) showPostularmeFooterView 
{ 
    NSAssert(_state==ESTADO_POSTULACION_NO_POSTULADO, @"NJDetalleEmpleoViewController: This shouldn't happen"); 

    if(!self.footerView) 
    { 
     NJDetalleEmpleoPostularmeTableViewCell *footerView = [self.tableView dequeueReusableCellWithIdentifier:kDetalleEmpleoPostularmeCell]; 
     [footerView configureCell:self.detaleAviso]; 
     float h = self.view.frame.size.height-footerView.cellHeight; 
     footerView.frame = CGRectMake(0,h,self.view.frame.size.width,footerView.cellHeight); 
     footerView.delegate = self; 
     self.footerView = footerView; 
     [self.view addSubview:self.footerView]; 
     [self.view bringSubviewToFront:self.footerView]; 
    } 
} 

-(void) hidePostularmeFooterView 
{ 
    if(self.footerView) 
    { 
     [self.footerView removeFromSuperview]; 
    } 

    self.footerView = nil; 
} 

Ale ten kod ma błąd, że nie może wydawać się, aby dowiedzieć się: raz kran autora na UITextBox i wchodzi jakiś tekst to rozpocznie się zachowujesz się nieregularnie, tzn .: 2 lub więcej Komórek pojawia się na ekranie, kiedy ich nie ma! Zasadniczo, gdy wywołuję metodę "hidePostularmeFooterView", nie wydaje się, że znika (dopiero po wprowadzeniu jakiegoś tekstu, jeśli nie wchodzę z nią w interakcję, działa dobrze).

enter image description here

To wydaje się po tym, jak wprowadzić tekst istnieją 2 wersja stopce, oto dowód:

enter image description here

+0

Przez wygląda na to, może to mieć coś wspólnego z tym, jak pokazać/ukryj klawiaturę i sposób jej interakcji z widokami. Na marginesie, czy trzeba cały czas tworzyć ten widok? Zachowałoby się ładniej, gdybyś go raz utworzył i po prostu pokazał i ukrył widok. –

Odpowiedz

3

enter image description here

Nie chciałbym dotknąć footerView, ale zamiast utworzyć widok niestandardowy, który zapala się, jak takie:

dataSource = [NSMutableArray new]; 
for (int n = 0; n < 100; n++){ 
    [dataSource addObject:[NSString stringWithFormat:@"%i",n]]; 
} 

table = [UITableView new]; 
table.frame = self.view.bounds; 
table.delegate = self; 
table.dataSource = self; 
[self.view addSubview:table]; 

popUpView = [UIImageView new]; 
popUpView.frame = CGRectMake(0, h-200, w, 200); 
popUpView.image = [UIImage imageNamed:@"Grumpy-Cat.jpg"]; 
popUpView.contentMode = UIViewContentModeScaleAspectFill; 
popUpView.clipsToBounds = true; 
popUpView.layer.borderColor = [UIColor redColor].CGColor; 
popUpView.layer.borderWidth = 2.0f; 
[self.view addSubview:popUpView]; 

Ustaw tableView jak zwykle, a w sposobie scrollViewDidScroll, możesz przykleić coś takiego:

NSIndexPath * specialRow = [NSIndexPath indexPathForRow:50 inSection:0]; 
NSArray * indices = table.indexPathsForVisibleRows; 
if ([indices containsObject:specialRow]){ 
    if (isShowing){ 
     isShowing = false; 
     [UIView animateWithDuration:1.0f 
           delay:0.0f 
      usingSpringWithDamping:1.0f 
       initialSpringVelocity:0.8f 
          options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState 
         animations:^{ 
          popUpView.transform = CGAffineTransformMakeTranslation(0, popUpView.frame.size.height + 10); 
         } 
         completion:^(BOOL finished){ 
         }]; 
    } 
} else if (!isShowing) { 

    isShowing = true; 
    [UIView animateWithDuration:1.0f 
          delay:0.0f 
     usingSpringWithDamping:1.0f 
      initialSpringVelocity:0.8f 
         options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         popUpView.transform = CGAffineTransformIdentity; 
        } 
        completion:^(BOOL finished){ 
        }]; 
} 

Where isshowing jest boolowskim śladem stanu popUpView. To szybki i brudny kod, powinien zadeklarować specialRow itp. Gdzie indziej. W tym przypadku jest to 50. z 100 wierszy.

Dla przypomnienia, nie sądzę, że to dobry projekt mieć duplikat funkcjonalności takiego, ale hej, klient wie najlepiej: D

+1

Dziękuję Johhny Rockex, spróbuję tego i zaznaczę odpowiedź tak jak najszybciej. Dziękuję Ci! –

5

Może to więcej sensu, aby po prostu usunąć to jako komórka & stopka i zastąpić ją jako własną UIView poniżej UITableView, a wysokość ramki UITableView sprowadza się tylko do początku tego widoku, zamiast zajmować cały ekran. W ten sposób będziesz w stanie widzieć i wchodzić w interakcję z widokiem przez cały czas. Czy jest jakiś powód, dla którego potrzebujesz tego jako UITableViewCell?

+0

Nie lubię poruszać poglądów wokół, ale na pewno spróbuję tego pomysłu. Dziękuję @richiereitz –