2017-01-30 4 views
5

UIViewControllerに通常のUITableViewがあり、フルスクリーンに制限されています。このtableViewには、カスタムインタラクティブtableHeaderViewがあります。 tableHeaderViewはサイズが動的で、独自に展開されます。 headerViewにはtextFieldがあり、textFieldのフォーカスに応じて独自のサイズが変更されます。UITableViewのアニメーション中にセルが消えています

tableHeaderViewのサイズを変更すると、画面の下部にあるセルが常に正しくアニメーション化されないという問題があります。 アニメーションブロック内にlayoutIfNeeded()の後にtableView.beginUpdates()tableView.endUpdates()と呼んでいます。これは行われなければならない、またはセルは動的サイズに全く追従しない。

私はこのgifを作成しました。アニメーション中の下部のセルを特に見てください。私はアニメーションをかなり遅くしていますので、問題を見るのは簡単です。

gif of problem

投機:のtableViewは、アニメーションが開始されるとすぐにcellForRow:indexPath:のために呼び出し、何らかの形で全体のtableViewは、アニメーションの後になります状態何かを見つけ、不要な細胞を除去するようにそれは私には思われます、アニメーションがまだ完成していないにもかかわらず。 同じように、ヘッダーを折りたたむとき、一番下のセルは、すでにロードされているセルと同じ方法でアニメートされません。彼らは別のアニメーションでアニメーション化されています。

どうしてですか?これは予防可能ですか?

編集:

self.navigationController?.setNavigationBarHidden(isEditing, animated: true) 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 

    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.setContentOffset(point, animated: false) 
    }  

    tableHeaderView.frame = frame 
    tableHeaderView.layoutIfNeeded() 
    self.view.layoutIfNeeded() 
    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+2

コードを表示できますか? – jalone

+0

ストーリーボードで - シーンを選択 - >アトリビュートインスペクターを表示 - >上のバーの下に、上のバーの下にアンラインします。 – Pavankumar

+0

@Sti:コードを共有する必要があります。 – Poles

答えて

0

[OK]をアニメーションコード、私はあなたのプロジェクトが表示されていないので、私は、それをチェックすることはできませんが、私のバージョンを提案しようとするでしょう。私はそれをコンパイルしようとしなかったので、間違いがあるかもしれません。

var navFrame = self.navigationController?.navigationBar.frame 
navFrame.origin.y = isEditing ? -navFrame.size.height : 0 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 
    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.contentOffset = point 
    } 

    self.navigationController?.navigationBar.frame = navFrame 

    tableHeaderView.frame = frame 

    self.view.layoutIfNeeded() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+0

ありがとう、私は試してみる時間が来たときにこれを試してみます。しかし、なぜ私が既に持っていたように 'self.navigationController?.setNavigationBarHidden(isEditing、animated:true) 'を使用するのではなく、なぜ手動でnavigationBarを隠すのでしょうか?あなたはそれが問題に関連していると思いますか? – Sti

+0

@Stiええ、おそらくアニメーションが衝突します。 – jesse

0

私はちょうど彼らの応答は逐語的にこの問題についてバックアップルの開発者向け技術サポートチームから聞いて、ここだ(強調鉱山)

こんにちはニコラス、

をいただき、ありがとうございますApple Developer Technical Support(DTS)にお問い合わせください。

説明した動作と結果の制限は仕様です。

あなたは別のアプローチは、Appleによって考慮されるべきであると思われる場合は、 は、我々は どのようにこの設計上の決定に影響を与える、あなたを、そして何が違っ を行って見たい情報を強化リクエストを提出することをお勧めします。

動作が変更される可能性はありませんが、 問題の考えを確実にする最も良い方法は、決定を担当する チームです。

よろしく、

アップルの開発者向け技術サポート

我々がちょうどtableView.setContentOffset(_:animated:)またはtableView.scrollToRow(at:at:animated:)のいずれかに簡単なコールを使用することで立ち往生しているようです。

+0

setContentOffsetまたはscrollToRowはこれをどのように修正しますか? – Sti

+0

これはカスタムアニメーションとの同期機能を持たない標準的なメソッド呼び出しを使用しているだけなので、チームが拡張要求を提出することを示唆しています。言い換えれば、アニメーションブロックの外にあるメソッドのいずれかに呼び出しを移動することによって、そのオブジェクトを「修正」することができます。 – gomollon

関連する問題