[解決済み] autolayoutですべてのサブビューに合うようにスーパービューのサイズを変更する方法?
質問
私の理解では、オートレイアウトはスーパービューのサイズを取り、制約と固有サイズに基づいて、サブビューの位置を計算することです。
このプロセスを逆転させる方法はありますか?私は、制約と本質的なサイズに基づいてスーパービューのサイズを変更したいです。これを実現する最も簡単な方法は何でしょうか?
Xcodeでデザインしたビューがあり、それをヘッダーとして
UITableView
. このビューには、ラベルとボタンが含まれています。ラベルの大きさは、データによって異なります。制約によって、ラベルがボタンを押し下げることに成功するか、ボタンとスーパービューの下部の間に制約がある場合、ラベルは圧縮されます。
同じような質問をいくつか見つけたのですが、良い簡単な答えがありません。
どのように解決するのですか?
使用する正しいAPIは
UIView systemLayoutSizeFittingSize:
のどちらかを渡します。
UILayoutFittingCompressedSize
または
UILayoutFittingExpandedSize
.
通常の
UIView
autolayoutを使用した場合、制約が正しい限り、この方法で動作するはずです。 もし、これを
UITableViewCell
(例えば行の高さを決めるために)セルに対してこれを呼び出す必要があります。
contentView
で、高さを取得します。
ビューに1つ以上のUILabelがあり、それが複数行にわたる場合、さらなる考慮事項があります。 このような場合
preferredMaxLayoutWidth
プロパティが正しく設定され、ラベルが正しい
intrinsicContentSize
で使用されます。
systemLayoutSizeFittingSize's
を計算します。
EDIT: ご要望により、テーブルビューセルの高さ計算の例を追加しました。
テーブルセルの高さ計算にオートレイアウトを使用すると、超効率的ではありませんが、特に複雑なレイアウトを持つセルがある場合、確かに便利です。
上で述べたように、複数行の
UILabel
を同期させることが不可欠です。
preferredMaxLayoutWidth
をラベルの幅に合わせます。 私は、カスタム
UILabel
のサブクラスで行います。
@implementation TSLabel
- (void) layoutSubviews
{
[super layoutSubviews];
if ( self.numberOfLines == 0 )
{
if ( self.preferredMaxLayoutWidth != self.frame.size.width )
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[self setNeedsUpdateConstraints];
}
}
}
- (CGSize) intrinsicContentSize
{
CGSize s = [super intrinsicContentSize];
if ( self.numberOfLines == 0 )
{
// found out that sometimes intrinsicContentSize is 1pt too short!
s.height += 1;
}
return s;
}
@end
UITableViewController のサブクラスで heightForRowAtIndexPath を実演しています。
#import "TSTableViewController.h"
#import "TSTableViewCell.h"
@implementation TSTableViewController
- (NSString*) cellText
{
return @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}
#pragma mark - Table view data source
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
return 1;
}
- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger) section
{
return 1;
}
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
static TSTableViewCell *sizingCell;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell"];
});
// configure the cell
sizingCell.text = self.cellText;
// force layout
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
// get the fitting size
CGSize s = [sizingCell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
NSLog( @"fittingSize: %@", NSStringFromCGSize( s ));
return s.height;
}
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
TSTableViewCell *cell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell" ];
cell.text = self.cellText;
return cell;
}
@end
シンプルなカスタムセルです。
#import "TSTableViewCell.h"
#import "TSLabel.h"
@implementation TSTableViewCell
{
IBOutlet TSLabel* _label;
}
- (void) setText: (NSString *) text
{
_label.text = text;
}
@end
そして、Storyboardで定義された制約のイメージです。 ラベルに高さ/幅の制約がないことに注意してください - これらは、ラベルの
intrinsicContentSize
:
関連
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] Swift 3でディスパッチキューを作成する方法
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み】UIScrollView Scrollable Content Size Ambiguity
-
[解決済み】Xcode 6でAutoLayout制約を使用してアスペクトフィットの動作をエミュレートする
-
[解決済み] iOSです。オートレイアウトで複数行のUILabelを使用する
-
[解決済み] UIViewsを非表示にしたAutoLayout?
最新
-
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のエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] 文字列の長さを取得する
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] CocoaPodsの最新バージョンにアップデートしますか?
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] ファイルはユニバーサル(3スライス)ですが、iOSの静的ライブラリのための(n)ARMv7-sスライスエラーが含まれていない、どうにかして回避するには?
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。