[解決済み] ビューを非表示にしたときに、オートレイアウトで他のビューを移動するには?
質問
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のスペーシング制約を戻す方法が必要なのです。
関連
-
IOSラーニングノート「このクラスはxxxのキーバリューコーディングに対応していません」問題解決
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] ファイルはユニバーサル(3スライス)ですが、iOSの静的ライブラリのための(n)ARMv7-sスライスエラーが含まれていない、どうにかして回避するには?
-
[解決済み】ストーリーボードで、複数のコントローラで使用するためのカスタムセルを作成する方法は?
-
[解決済み] iOSです。オートレイアウトで複数行のUILabelを使用する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[iOS]コンパイルエラー:ld: アーキテクチャ x86_64 のシンボルが見つかりません。
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] UITableView - トップにスクロールする
-
[解決済み] swiftで電子メールアドレスを検証する方法は?