18

自動レイアウト (制約) ベースのアプリケーションを使用していますが、向きを変更した後のテーブルビューに問題があることに気付きました。再現手順は次のとおりです (私は非常に基本的な再現アプリを持っています - テーブルビューと新しいアイテムを追加する追加ボタンを備えています)。

  1. テーブルビューが横向きになるように、アプリケーションを横向きモードに回転します。
  2. テーブルビューに項目を追加します。以下の 1 を参照してください
  3. 回転してポートレートに戻すと、テーブルビューは水平パンでフロートします (スクロール ビューアーのコンテンツ サイズがランドスケープであるかのように)。[2] を参照してください。

1追加するコード

- (IBAction)onAdd:(id)sender {
    count ++;
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
}

[2]フローティングテーブルビュー

ここに画像の説明を入力

この問題を回避する方法についてのアイデアはありますか? また、これが既知の問題なのか、Apple に報告する必要があるものなのか、どうすればわかりますか?

4

2 に答える 2

32

これはバグだと思います。プロジェクトを自動レイアウトから変換し、適切なサイズ変更マスクを設定すると、すべて正常に機能します。バグをうまく再現する単純なサンプル プロジェクトがある場合は特に、バグを報告する必要があります。

あなたのケースで起こっていることは、あなたが疑ったとおりです-ビュー自体が縦向きにサイズ変更されても、スクロールビューのコンテンツビューは横向きのままであるため、突然水平方向にドラッグできるようになります。

幸いなことに、かなり簡単な回避策があります。さまざまな組み合わせを試してみましたが、成功したり失敗しsetNeedsLayoutたりsetNeedsUpdateConstraintsしましたが、次の 2 つのソリューションのいずれかを実装できます。

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

または、

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGSize contentSize = self.tableView.contentSize;
    contentSize.width = self.tableView.bounds.size.width;
    self.tableView.contentSize = contentSize;
}
于 2013-01-20T20:38:43.610 に答える
3

上記の答えはほとんどの場合機能しますが、常に機能するわけではありません。最も堅牢なソリューションは、UITableView をサブクラス化し、layoutSubviews 内で contentSize を設定することです。

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGSize contentSize = self.contentSize;
    contentSize.width  = self.bounds.size.width;
    self.contentSize   = contentSize;
}
于 2013-06-15T22:33:38.077 に答える