2016-12-08 2 views
10

根本的な原因は、estimatedRowHeightが基礎となるUIScrollView.contentOffsetについての仮定を作るのに使用されていると考えていますが、これは見積もりであるため、常に定義上間違っています。実際の行の高さは、セルの内容とデバイスの向きによってまったく異なります。このtableView textFieldの自動レイアウトの不具合を修正または回避するにはどうすればよいですか?

さらに近い推定値を提供するためにestimatedHeightForRowAtIndexPathを実装しても、グリッチはまだ存在します。

トップビューからスクロールダウンすると、TableViewはセル位置と同期してcontentOffsetを保持するため、実際のセル高さを学習するため、すべてがうまくいきます。しかし、すべての実際のセルの高さが回転するとすぐにUITableViewが同期しなくなり、どこにスクロールするのかわからなくなります。

しかし、あまりにも起こっても、他人の事は時々UITextFieldセルが、私は簡単な例に、すべてを煮詰めてきたとにかく別のセルの上に終わると、そこに立ち往生したまま...

ます、があります。 iPhoneで、次いでソフトウェアキーボードを有効にシミュレータを使用している場合

https://github.com/trapper-/autolayout-glitch

  • テスト。
  • スクロールしたり、フィールドを選択したり、回転したりするだけで、多くの視覚的な不具合が表示されます。
  • 簡単な反復可能な例については、
  • 下にスクロールします。
  • UITextField'sの最後のカップルを1つ選択すると、UITableViewがスクロールしてフィールドが確実に表示されます。
  • デバイスを回転します。
+0

理想的ではありませんが、tableViewインスタンスのreloadData呼び出しが役立ちます。それを試しましたか? –

+0

AutolayoutはUITableViewではうまく動作しません。 CollectionViewの使用を検討してください。これは、UITableViewの制限についての素晴らしい記事です:https://pspdfkit.com/blog/2017/the-case-for-deprecating-uitableview/ –

+0

あなたは 'UICollectionView'にこれらの同じ種類のグリッチがないと言っていますか?もしそうなら、それはすばらしい解決策になるでしょう。 – trapper

答えて

1

私は同様の問題を抱えていたので、私は数分間あなたのコードを試しました。私は助けてくれることを期待していましたが、完全に解決されませんでした。

私が提供できるものは、の一部がとなったことです。

デバイスが回転すると、UIViewcontrollerメソッドを実装して、それが起こることを通知する必要があります。発生すると、表示されている行をキャッシュします。その後、テーブルをリロードし、表示されている行にスクロールします。それはこのようになります

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    // Save the visible row position 
    self.visibleRows = [self.tableView indexPathsForVisibleRows]; 
} 

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.tableView reloadData]; 
    // Scroll to the saved position prior to screen rotate 
    [self.tableView scrollToRowAtIndexPath:[self.visibleRows objectAtIndex:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
} 

visibleRowsはあなたのViewControllerの配列@propertyです。

これは、これはやったrightish場所(私はあなたが実際にユーザーが操作した個々のセルをオフに保存されている場合、これは右のセルにあなたのたびに100%になるだろうと思われる。

に行かせました

また、解決策ではありませんが、私が見たものを共有したかったので、解決策を見つけるのに役立ちます。 。

Good Luck!

+0

目に見える行の追跡については悪い考えではありませんが、scrollToRowAtIndexPathメソッドにも多くの問題があります。スクロール先はわかりません。つまり、indexPathを正しいcontentOffsetに正しく変換しません。 – trapper

+0

ええ、私は、細胞がまず最初からうっすらにレイアウトされているという事実と関係があると考えています。 –

0

私はかなり確信して、あなたの問題はラインである:

self.tableView.estimatedRowHeight = 44; 

これは、この推定高さの周りにいくつかの最適化を行っているテーブルビューになります。私はテキストフィールドが選択されたときにこれがなぜ壊れているのかは分かりませんでしたが、それは私がそれを絞り込むために管理したものです。あなたが実際に明示的に行ごとの高さを計算しなければ、問題が離れて行くように見える(これは単なる荒い例であることに注意してください、そして、あなたは、実際の実装にもう少し考えを配置する必要があります):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath.row % 2) { 

     return 44.f; 

    } else { 

     NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 

     CGRect frame = [text boundingRectWithSize:CGSizeMake(350.f, CGFLOAT_MAX) 
              options:NSStringDrawingUsesLineFragmentOrigin 
             attributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:14.f] } 
              context:nil]; 

     return frame.size.height; 
    } 
} 
0

私はそのプロジェクトを見ました。いくつかの問題を軽減するための私の最善の提案は、推定された身長計算を改善することでした。テキストビューのセルが大きくなる場合は、推定された高さをセルの平均高さに近づける必要があるため、回転するとワイルドサイズの変更が少なくなります。

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath (NSIndexPath *)indexPath 
{ 
    if (indexPath.row % 2) { 
     return 44.0f; 
    } else { 
     return 175.0f; 
    } 
} 

は今のUITextFieldとの奇妙な問題については、私は、UITextFieldのは、セルが再利用されているにもかかわらず、まだ最初の応答者であるかのように、あなたは、これらの細胞がさえ回転に再利用されていることを考慮する必要があるかもしれないと思いますキーボードがテキストフィールドのトラッキングに問題がある場所です。

あなただけのセルにタグを設定することによって、この結果を見ると、そのようにそれがランダムに回転に順序をどのように変化するかを見ることができます。そのため

NSString* cellID = @"TextFieldCell"; 
TextFieldCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath]; 
NSLog(@"cell %@, changing to %@", @(cell.tag), @(indexPath.row)); 
cell.tag = indexPath.row; 
return cell; 

私の提案は、1)のテキストフィールドを使用しないことのいずれかであります2)ユーザーがスクロールしているアイテムにテキストを入力できるようにする新しい方法を考えてください。たとえば、テキストビューの上部にあるビューにテキストフィールドのコピーを配置し、テキストを入力している間に手動で管理し、テキストが完了したらテキストをセルにコピーし直します。 3)オプション3は、キーボードマネージャライブラリが役立つかどうかを調べることです。私は本当にIQKeyboardManagerを使用して好きです。キーボードの管理を解決するのに便利です。

関連する問題