2017-07-21 34 views
9

Bu nedenle, müşterinin isteği, UITableView öğesinin, her zaman satırında birine sahip olmasını ister, böylece kullanıcı, bu önemli düğme ile UITableView öğesinin herhangi bir konumunda etkileşim kurabilir. Kaydırdığında ve bu tuş ile gerçek Satır'ı görmeye başladığında, kayan altbilginin kaybolması ve kullanıcının 'gerçek' Hücre ile etkileşime girmesine izin verilmemesi gerekir.UITableView özel UIView kopyaları

Aşağıdaki kod ile geldim:

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

Ama bu kod ben anlamaya zorlandığım bir hata vardır: kullanıcı musluk UITextBox üzerinde ve o başlar biraz metin girdiğinde düzensiz davranmak, yani: Hiçbiri olmamalı, ekranda 2 veya daha fazla Hücre görünür! Temel olarak, 'hidePostularmeFooterView' yöntemini çağırdığımda, kaybolmaz gibi görünüyor (Yalnızca bir metin girdikten sonra, eğer onunla etkileşime girmezsem, iyi çalışıyor).

enter image description here

O var ben Altbilgi 2 versiyonu vardır metin girin sonra burada görünüyor kanıtı: Bu gibi bu kaldırmak için daha mantıklı olabilir

enter image description here

+0

, bunu göstermek nasıl bir ilgisi olabilir/klavyeyi ve bunun görünümlerinizle nasıl etkileşimde bulunduğunu gizleyin. Bir yan not olarak, bu görünümü her zaman yaratmanız mı gerekiyor? sadece bir kez oluşturursanız ve sadece görünümü ve gizlemeyi bırakırsanız daha iyi davranır. –

cevap

3

enter image description here

Ben footerView dokunmak, ancak bunun yerine böyle gibi yanar özel bir görünüm oluşturmak olmaz:

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

zamanki gibi tableView ve scrollViewDidScroll yönteminde kurun böyle bir şey sopa olabilir: isShowing popUpView devletin bir boolean takip, olduğu

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

. Bu hızlı ve kirli kod, specialRow vb başka bir yerde ilan etmelidir. Bu durumda, 100 satırın 50'si olarak tanımlanır. Kayıt için

, böyle olsun yinelenen özelliğe sahip iyi tasarım olduğunu düşünüyorum, ama hey yok, istemci en iyisini bilir: Sokağa bakılırsa D

+1

Teşekkür ederim Johhny Rockex, Bunu deneyeceğim ve cevabını ASAP olarak işaretleyeceğim. Teşekkür ederim! –

5

Bir hücre & altbilgi ve UITableView'un altında kendi UIView olarak değiştirin ve UITableView'un çerçeve yüksekliğini yalnızca tüm ekranı kaplamak yerine bu görünümün y kökenine inin. Bu sayede manzarayı her zaman görebilir ve etkileşime girebilirsiniz. UITableViewCell olmak için buna ihtiyacınız var mı?

+0

Çok fazla hareket eden manzaralara çok düşkün değilim, ama ben kesinlikle bu fikri deneyeceğim. Teşekkür ederiz @richiereitz –