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);
}
istiyorum tam olarak ne yapacak kısıtlamaları kaldırmak yerine onu devre dışı bırakmak için [hücre removeConstraints: cell.constraintTextViewHeight] '? – Randy
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
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