1. ホーム
  2. ios

[解決済み] ビューを非表示にしたときに、オートレイアウトで他のビューを移動するには?

2022-03-15 17:02:16

質問

IBでカスタムセルを設計し、それをサブクラス化し、アウトレットをカスタムクラスに接続しました。セルコンテンツに3つのサブビューがあります。UIView(cdView)、2つのラベル(titleLabelとemailLabel)です。各行で利用可能なデータに応じて、私はUIViewと2つのラベルをセルに表示したいときもあれば、2つのラベルだけのときもあります。私がしようとしているのは、UIViewプロパティをhiddenに設定するか、スーパービューからそれを削除すると、2つのラベルが左に移動するように制約を設定することです。私は、UIViewのリーディング制約を10pxのSuperview(Cell content)に設定し、UILabelsのリーディング制約を10pxの次のビュー(UIView)に設定しようとしました。私のコードの後半で

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath {
    
    // ...

    Record *record = [self.records objectAtIndex:indexPath.row];
    
    if ([record.imageURL is equalToString:@""]) {
         cell.cdView.hidden = YES;
    }
}

Cell.cdViewを隠しているので、ラベルを左に移動させたいのですが、Cellの同じ位置にとどまっています。スーパービューからcell.cdViewを削除しようとしましたが、それもうまくいきません。私が何を言っているのかを明確にするために、画像を添付しています。

私はこれをプログラムで行う方法を知っており、その解決策を探しているわけではありません。私が欲しいのはIBで制約を設定することであり、他のビューが削除されたり隠されたりした場合に、私のサブビューが動的に移動することを期待しています。自動レイアウトを備えたIBでこれを行うことは可能ですか?

.....

解決方法は?

それは可能ですが、少し余分な作業をする必要があります。まず最初に、概念的なことがいくつかあります。

  • 描画しないのに隠しビュー。 参加する は自動レイアウトで、通常は フレームを保持する 他の関連するビューはその場所に残しておきます。
  • ビューをそのスーパービューから削除する場合。 関連するすべての制約 は、そのビュー階層からも削除されます。

あなたの場合、これはおそらく次のことを意味します。

  • 左側のビューを非表示に設定すると、その左側のビューが(表示されていなくても)まだスペースを取っているため、ラベルがそのまま残ってしまいます。
  • 左側のビューを削除すると、ラベルの左側エッジの制約がなくなるので、ラベルはおそらく曖昧な制約のままとなります。

必要なのは、判断力 オーバーコンストレイン のラベルを作成します。既存の制約(他のビューに対して10ptsのスペース)はそのままにして、別の制約を追加します。ラベルの左端を、必須ではない優先度で、そのスーパービューの左端から10pts離します(デフォルトの高い優先度がおそらくうまくいくでしょう)。

そして、左に移動させたいときは、左側のビューを完全に削除してください。左ビューに対する必須の10pt制約は、それに関連するビューとともに消え、ラベルがそのスーパービューから10pt離れるという優先度の高い制約だけが残ります。次のレイアウトパスでは、ラベルはスーパービューの幅を満たすまで左に展開されますが、エッジの周囲にはスペースが必要です。

重要な注意点として、左側のビューを再び表示させたい場合は、ビュー階層に戻すだけでなく、以下の手順も必要です。 すべての制約を再確立する を同時に実行します。つまり、そのビューが再び表示されたときに、ビューとそのラベルの間に10ptのスペーシング制約を戻す方法が必要なのです。