2015-11-03 105 views
1

我想在UITableView的底部添加單元格,並滾動以使其完全可見(就像在發送或接收消息時在Whatsapp中一樣)。在底部添加單元格並滾動UITableView

我試着這樣做:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:[self.tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

但是這使得圖形毛刺和表閃爍,做一個壞的滾動,而不是平滑的。

對此有何幫助?

+2

我不是在一個位置肯定地說,但它可能是WhatsApp的實際滾動到的tableView頂(0,0)。這是一些消息傳遞應用程序用來旋轉tableView然後每個單元旋轉180度的技巧。這給出向下滾動的視覺效果,但滾動的程序化視圖。 – Avi

+1

改變動畫:是動畫:否 – Subash

+0

Subash的建議工程。你不能同時調用兩個動畫。 – Dave

回答

0

例如函數中添加一個項目:

- (IBAction)addItem:(UIBarButtonItem *)sender { 
    [self.items addObject:[NSString stringWithFormat:@"Item %lu", self.items.count + 1]]; 

    NSIndexPath *indexPathToInsert = [NSIndexPath indexPathForRow:self.items.count - 1 inSection:0]; 
    [self.tableView insertRowsAtIndexPaths:@[indexPathToInsert] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [self.tableView scrollToRowAtIndexPath:indexPathToInsert atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
} 

我的動畫看起來完全沒有這樣!

+0

我試過了,但整個表格視圖在閃爍的同時滾動......感謝反應 – facumedica

0

那麼,我所做的是使用[self.tableView scrollToRowAtIndexPath...,但從0.1s NSTimer調用它。

2

在這裏我做了什麼時,插入的行,然後改變了的tableView

的內容插圖
-(IBOutlet)sendButton:(id)sender 
{ 
    [array addObject:textView.text]; 
    [self addAnotherRow]; 
} 
- (void)addAnotherRow { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForItem:(array.count - 1) inSection:0]; 
     [self.messagesTableView beginUpdates]; 
     [self.messagesTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
     [self.messagesTableView endUpdates]; 
     [self updateContentInsetForTableView:self.messagesTableView animated:YES]; 

     // TODO: if the scroll offset was at the bottom it can be scrolled down (allow user to scroll up and not override them) 

     [self.messagesTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
} 

- (void)updateContentInsetForTableView:(UITableView *)tableView animated:(BOOL)animated { 
    NSUInteger lastRow = [self tableView:tableView numberOfRowsInSection:0]; 
    NSLog(@"last row: %lu", (unsigned long)lastRow); 
    NSLog(@"items count: %lu", (unsigned long)array.count); 

    NSUInteger lastIndex = lastRow > 0 ? lastRow - 1 : 0; 

    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:lastIndex inSection:0]; 
    CGRect lastCellFrame = [self.messagesTableView rectForRowAtIndexPath:lastIndexPath]; 

    // top inset = table view height - top position of last cell - last cell height 
    CGFloat topInset = MAX(CGRectGetHeight(self.messagesTableView.frame) - lastCellFrame.origin.y - CGRectGetHeight(lastCellFrame), 0); 

    // What about this way? (Did not work when tested) 
    // CGFloat topInset = MAX(CGRectGetHeight(self.tableView.frame) - self.tableView.contentSize.height, 0); 

    NSLog(@"top inset: %f", topInset); 

    UIEdgeInsets contentInset = tableView.contentInset; 
    contentInset.top = topInset; 
    NSLog(@"inset: %f, %f : %f, %f", contentInset.top, contentInset.bottom, contentInset.left, contentInset.right); 

    NSLog(@"table height: %f", CGRectGetHeight(self.messagesTableView.frame)); 

    UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; 
    [UIView animateWithDuration:animated ? 0.25 : 0.0 delay:0.0 options:options animations:^{ 
     tableView.contentInset = contentInset; 

    } completion:^(BOOL finished) { 
    }]; 
} 

注:查看從陣列現有的訊息,你必須包括這 也。

- (void)viewDidLayoutSubviews { 
    [self updateContentInsetForTableView:self.messagesTableView animated:NO]; 
} 
1

使動畫的插入和endUpdates滾動底部後沒有動畫。工作對我來說

斯威夫特

self.tableView.beginUpdates() 
self.tableView.insertRowsAtIndexPaths(newIndexPaths, withRowAnimation: UITableViewRowAnimation.Top) 
self.tableView.endUpdates() 
self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: self.tableDataCount-1, inSection: 0), atScrollPosition: .Bottom, animated: false) 
相關問題