2016-02-07 8 views
8

私が正しくレイWenderlichガイドに基づいて動的な行の高さを有するように構成されたテーブルビューがhereを発見した:のUITableViewController:動的な行の高さと底部にスクロールすると、誤った位置にアニメーションを開始

Iは透明を有するように制約を設定しますセルの上端から下端までの制約線。私はまた、コンテンツの抱擁とコンテンツの圧縮抵抗の優先順位と推定行の高さを設定します。

これは、セットアップに私が使用するコードテーブルビューである:

func configureTableView() { 
    // its called on viewDidLoad() 
    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 100.0 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    configureTableView() 

    for i in 1...20 { 
     messages.append([ 
      "title": "foo \(i)", 
      "message": "bla \(i)\nbla\nbla" 
     ]) 
    } 

    // this is because the actual row heights are not available until the next layout cycle or something like that 
    dispatch_async(dispatch_get_main_queue(), {self.scrollToBottom(false)}) 
} 

func scrollToBottom(animated:Bool) { 
    let indexPath = NSIndexPath(forRow: self.messages.count-1, inSection: 0) 

    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: animated) 
} 

そして、これは私が新しい行を追加する方法である:デフォルトの行で

@IBAction func addMore(sender:UIBarButtonItem) { 
    let message = [ 
     "title": "haiooo", 
     "message": "silver"] 

    messages.append(message) 

    let indexPath = NSIndexPath(forRow: messages.count-1, inSection: 0) 

    tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Bottom) 

    scrollToBottom(true) 
} 

設定が細かいです。これは、行とスクロールを期待通りに下部に追加します。

しかし、その後に新しい行を追加すると、スクロールが最後のセルの上から始まるようです。セルを増やすと、オフセットが増えるようです。 Imgur

それは確かにアニメーションをオフにすると、それは適切にスクロールするためのスクロールアニメーション(ないにinsertRowアニメーション)に関連しています:

は、ここでそれは起こっ示すGIFです。

estimatedRowHeightを変更すると、スクロールオフセットが異なりますが、固定値が見つかりませんでした。

また、dispatch_asyncを使用してスクロールを遅らせてみましたが、何も変更されませんでした。

あなたにはアイデアはありますか?

+0

ビデオから、私は何が間違っているのかわかりません。そして、「スクロールが最後のセルの上から始まるように見える」ということを私は理解していません。明確にできますか?問題のあるサンプルプロジェクトを利用できるようにすることも役に立ちます。 –

+0

Daveは、セル17と18がスクロールが開始されたときに画面上部に表示されている状態になっていることに注意してください。アニメーションを開始する前に画面が上に移動するように見えます。 ここでソースコードを見つけることができます:https://github.com/marcio0/ios-playground/tree/master/scrolltest –

+0

OK、私はビデオでそれを見ることができます(私がそれをダウンロードしてフレームバイ-frame)。しかし、私はサンプルプロジェクトでそれを見ていません。私は別の電話機モデル(ただし9.2)を試してみましたが、アニメーションの速度を落とそうとしましたが、問題は見たことがありませんでした。 –

答えて

13

うわー、それは楽しいチャレンジでした。テストプロジェクトを投稿していただきありがとうございます。

だから、新しい行を追加した後に、テーブルビューがスクロールすると思うところがあるようです。 UIKitのバグであると私に思われます。そのため、アニメーションを適用する前にテーブルビューをリセットするコードを追加しました。私はそれがinsertRowsAtIndexPaths(_:withRowAnimation:)で動作させることができなかった

@IBAction func addMore(sender:UIBarButtonItem) { 
    let message = [ 
     "title": "haiooo", 
     "message": "silver"] 
    messages.append(message) 

    tableView.reloadData() 

    // To get the animation working as expected, we need to 'reset' the table 
    // view's current offset. Otherwise it gets confused when it starts the animation. 
    let oldLastCellIndexPath = NSIndexPath(forRow: messages.count-2, inSection: 0) 
    self.tableView.scrollToRowAtIndexPath(oldLastCellIndexPath, atScrollPosition: .Bottom, animated: false) 

    // Animate on the next pass through the runloop. 
    dispatch_async(dispatch_get_main_queue(), { 
     self.scrollToBottom(true) 
    }) 
} 

が、reloadData()がうまく働いた:

は、ここで私がなってしまったものです。その後、新しい最後の行にアニメーションを適用する前に同じ遅延が再度必要です。

関連する問題