2016-02-22 9 views
9

Ben bir düğmeye dokunarak bir uzatılabilir UITableViewCell koymak için çalışıyorum.Bir hücreyi yeniden boyutlandırmak için (bir yükseklik kısıtlaması devre dışı bırakıldıktan sonra) uitableview nasıl zorlanır?

Ben UITableViewCell yeni yüksekliğini anlatmak için dinamik UITextView zorlamak için kısıtlamaları kullanıyorum. (autolayout ve UITableViewAutomaticDimension kullanarak)

Düğme olmadan beklendiği gibi çalışır: UITableViewCell'un yüksekliği, UITextView'un yüksekliğine bağlıdır.

Düğmenin (hücre daraltılır) öğesine dokunduğunuzda, hücrenin boyutunu en üst düzeye çıkarmak için UITextView üzerinde bir kısıtlamaya sahip olmak için, UITextView (bu nedenle hücre yüksekliğini sınırlandıran) yükseklik sınırını kaldırmak ve hücreyi güncelleştirmek istiyorum buna göre. Ben düğmesine dokunun ve daha sonra benzer hücreye ilerlerseniz

-(void)extendCellWasTapped:(UITableViewCell*)senderCell{ 

    MAFollowingPostTableViewCell *cell = (MAFollowingPostTableViewCell*)senderCell; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

    if (![self.arrayExtendedTitlesAtIndexPaths containsObject:indexPath]) { 
     [self.arrayExtendedTitlesAtIndexPaths addObject:indexPath]; 
    } 

    if ([self.tableView.indexPathsForVisibleRows containsObject:indexPath]) { 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 

      [NSLayoutConstraint deactivateConstraints:@[cell.constraintTextViewHeight]]; 

      // CGPoint offset = self.tableView.contentOffset; 

      [self.tableView beginUpdates]; 
      [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
      [self.tableView endUpdates]; 

// I would like to minimize the animations as well here.. but thats another //problem 
//   [self.tableView.layer removeAllAnimations]; 
//   [self.tableView setContentOffset:offset animated:NO]; 
//   [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

     }); 
    } 
} 

, zaten genişletilir: İşte uzatmak yöntemidir. Yani burada bir şey özlüyorum. Kısıtlamayı devre dışı bıraktıktan sonra [cell updateConstraints] yapmayı denedim, ama işe yaramıyor. İlk başta

GÜNCELLEME

, düğme nedense görünmüyor. Ve fark ettim ki (aynı kodla birlikte) aşağı ve yukarı kaydırırsam düğme görünür ve eğer genişletmeye çalışırsam çalışır. Orada düğmeye uzatmak olduğunu

http://www.gfycat.com/FairBossyAfricanporcupine

Bildirim değil ama aşağı kaydırmak kez/yukarı çıkar gösterir ve hücre uzatır:

GÜNCELLEME

Bu benim UIViewController olduğunu Uzatma düğmesine dokunduğumda.

UPDATE

I yazı boyutu hesaplanacak olan zaman (hücre uzatılabilir olup olmadığını görmek için) fark, ilk başta, textview son durumunda daha geniştir. Ve CellForRowAtIndexPath üzerinde bu çeki yapıyorum:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

MAPostTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath]; 

cell.delegate = self; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 

MAPostFollowing *post = (MAPostFollowing*)[self.arrayPosts objectAtIndex:indexPath.section]; 

cell.textViewTitle.textContainer.lineBreakMode = NSLineBreakByWordWrapping; 

NSString *title = [post.post title]; 

[cell.textViewTitle setText:title]; 

UIButton * buttonExtend = [cell buttonExtend]; 

if ([self.arrayExtendedTitlesAtIndexPaths containsObject:indexPath]) { 
    cell.constraintTextViewHeight.active = NO; 

    if (![buttonExtend isHidden]) { 
     buttonExtend.hidden = YES; 
     buttonExtend.userInteractionEnabled = NO; 
    } 
}else{ 

    cell.constraintTextViewHeight.active = YES; 

    NSLog(@"index %li", (long)indexPath.row); 

    BOOL b = ![self isTitleExtendable:title forTextView:cell.textViewTitle]; // Checks if the current text view is able to fit the title. If not, it will show the buttonExtend 

    buttonExtend.hidden = b; 
    buttonExtend.userInteractionEnabled = !b; 

} 
} 
... 

Yani ilk çalıştırmada (kaydırma öncesi) [öz isTitleExtendable: Başlık forTextView: cell.textViewTitle]; textSize hesaplanırken textView doğru genişliğe sahip olmadığından istenen değeri döndürmez. Aşağıdaki seçenekler mevcuttur inanıyoruz Yani

: - bu (böylece doğru uzatılabilir Arabirim durumunu hesaplayarak) düzen değişti sonra yenilemek için textViewTitle zorlamak - textViewTitle genişliğini değiştirir kez uzatılabilir Arabirim durumunu yeniden kontrol

UPDATE

ReadyForReuse yönteminde, textViewTitle hala daha geniş bir çerçeveye sahiptir. LayoutSubviews yönteminde aslında küçük bir kareye sahip.Burada zorluk is daha sık çağrılan olması ve bu bana yanlış vakaları alır (düğme gösterilmeden zaman olmamalıdır)

Bu benim deneme edildi ki:

-(void)layoutSubviews{ 
[super layoutSubviews]; 

BOOL b = [self isTitleExtendable:self.textViewTitle.text forTextView:self.textViewTitle]; 

self.buttonExtend.hidden = !b; 
self.buttonExtend.userInteractionEnabled = b; 

if (!b) { 
    NSLog(@"Button hidden YES UserInteraction NO"); 
}else{ 
    NSLog(@"Button hidden NO UserInteraction YES"); 
} 

NSLog(@"textViewTitle layout %f",self.textViewTitle.frame.size.width); 
} 
+0

istiyorum tam olarak ne yapacak kısıtlamaları kaldırmak yerine onu devre dışı bırakmak için [hücre removeConstraints: cell.constraintTextViewHeight] '? – Randy

+0

aynı şey. Hücre yeniden kullanıldığında işe yarayıp yaramayacağından emin değilim (bu yüzden kaldırma yerine devre dışı bırakıyorum) – jonypz

+0

Sorunun ne olduğuna dair biraz kafam karıştı. GIF'inize baktığınızda, sorun, hücrenin ilk oluşturulduğunda düğmenin orada olmamasıdır. Soruda ima ettiniz, bunun yerine düğmenin orada ve çalışmıyor. Benimle kal, belki de sadece sorumu yanlış yorumluyor. – Eppilo

cevap

0

unutmak Are self.arrayExtendedTitlesAtIndexPaths dizin yolunu kaldırmak?

if (![self.arrayExtendedTitlesAtIndexPaths containsObject:indexPath]) { 
    [self.arrayExtendedTitlesAtIndexPaths addObject:indexPath]; 
} 
else 
{ 
    [self.arrayExtendedTitlesAtIndexPaths removeObject:indexPath]; 
} 
+0

Hayır. Bu, bir kullanıcı bir genişletme düğmesine dokunduktan sonra gerçekleştirilen işlemdir. Ve o bir kez, o hücre her zaman genişletilmiş olacak. – jonypz

0

düğmesi yoktur ve bunu tekrar göstermek kaydırma yaparken kesinlikle yeniden kullanılabilirliği ile ilgili bir sorun varsa.

cellForRowAtIndexPath:'da düğmeyi gösterme veya gizleme hakkında karar vermeniz olasıdır. Eğer bir durumunuz varsa, bu düğmeyi her zaman göstermeye çalışın ve eğer beklendiği gibi çalışacaksa, bu kısıtlama her ne zaman olursa olsun bir hücrenin içinde bir düğmeyi gizleyin. Doğru yöntem, UITableViewCell alt sınıfının içinde prepareForReuse dur.

+0

Bu gitmek için yol olabilir. Yine de uygulama hakkında% 100 emin değilim – jonypz

+0

güncellememi gözden geçirin – jonypz

-1

Değişiklikleriniz tamamlandıktan sonra [cell layoutSubviews]; numaralı telefonu arayın.

+0

layoutSubviews belgesine göre: method: "Bu yöntemi doğrudan çağırmamalısınız." – GingerBreadMane

1

Böyle bir şey yapmak için, kısıtlamaya güvenmemeniz gerekir, ancak tableView(_:heightForRowAtIndexPath:)'da, yalnızca içeriğe bağlı olarak doğru yüksekliği vermeniz yeterlidir.

Düğmenize basılması, tableView(_:heightForRowAtIndexPath:)'un, genişlettiğiniz hücreniz için farklı bir değer döndürmesi için bir değişikliği tetikler.

Ve sadece bu tetiği yaptıktan sonra

, sadece yapın:

aralarında bir şey olmadan
[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

, bu UITableView "doğal animasyon" tetikleyebilir ve size denemek ne olur

+0

açıklamasında, UITableViewAutomaticDimension kullanıyorum – jonypz

+0

Animasyon güncellemesini zorlamak için başlangıç ​​sonu güncelleme numarasını kullanmaya devam ediyorum;) Ama otomatik boyutlu hücreleri kullanırken denemedim – AncAinu

İlgili konular