[解決済み] UITableViewのtableHeaderViewでAutoLayoutを使用することはできますか?
質問
私が
AutoLayout
を発見して以来、私はあらゆるところでそれを使っていますが、今、私はそれを
tableHeaderView
.
を作りました。
subclass
の
UIView
に、必要なものすべて(ラベルなど)を制約付きで追加し、次に、この
CustomView
に
UITableView
'
tableHeaderView
.
を除いて、すべてうまく動作します。
UITableView
が常に表示されます。
の上に
の上に表示されます。
CustomView
によって
上記
を意味します。
CustomView
は
の下に
は
UITableView
の下にあるので、見えません。
どうやら、何をやっても
height
の
UITableView
'
tableHeaderView
は
常に
0です(幅、x、yも同様)。
私の質問:それは、次のことを達成するためにまったく可能ですか? フレームを手動で設定することなく ?
EDIT :
また
CustomView
'
subview
という制約があります。
_title = [[UILabel alloc]init];
_title.text = @"Title";
[self addSubview:_title];
[_title keep:[KeepTopInset rules:@[[KeepEqual must:5]]]]; // title has to stay at least 5 away from the supperview Top
[_title keep:[KeepRightInset rules:@[[KeepMin must:5]]]];
[_title keep:[KeepLeftInset rules:@[[KeepMin must:5]]]];
[_title keep:[KeepBottomInset rules:@[[KeepMin must:5]]]];
制約を手動で書くと時間がかかるし、1つの制約に対して行数が多すぎるので、便利なライブラリ 'KeepLayout' を使っていますが、メソッドは自明です。
そして
UITableView
にはこのような制約があります.
_tableView = [[UITableView alloc]init];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_tableView];
[_tableView keep:[KeepTopInset rules:@[[KeepEqual must:0]]]];// These 4 constraints make the UITableView stays 0 away from the superview top left right and bottom.
[_tableView keep:[KeepLeftInset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepRightInset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepBottomInset rules:@[[KeepEqual must:0]]]];
_detailsView = [[CustomView alloc]init];
_tableView.tableHeaderView = _detailsView;
に直接何らかの制約を設定しなければならないかどうかはわかりません。
CustomView
の制約によってCustomViewの高さが決定されると思います。
UILabel
"title"の中にあります。
EDIT 2: 再度調査したところ、CustomViewの高さと幅は正しく計算されているようですが、CustomViewの上部がUITableViewの上部と同じ高さになったまま、スクロールすると一緒に移動してしまうようです。
どのように解決するのですか?
同じような質問をしたことがあります。 ここで . 要約すると、私はヘッダーを一度追加し、必要な高さを見つけるためにそれを使用します。そしてその高さはヘッダーに適用することができ、ヘッダーは変更を反映するために2回目に設定されます。
- (void)viewDidLoad
{
[super viewDidLoad];
self.header = [[SCAMessageView alloc] init];
self.header.titleLabel.text = @"Warning";
self.header.subtitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long.";
//set the tableHeaderView so that the required height can be determined
self.tableView.tableHeaderView = self.header;
[self.header setNeedsLayout];
[self.header layoutIfNeeded];
CGFloat height = [self.header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
//update the header's frame and set it again
CGRect headerFrame = self.header.frame;
headerFrame.size.height = height;
self.header.frame = headerFrame;
self.tableView.tableHeaderView = self.header;
}
複数行のラベルがある場合、これもカスタムビューが各ラベルのpreferredMaxLayoutWidthを設定することに依存します。
- (void)layoutSubviews
{
[super layoutSubviews];
self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.frame);
self.subtitleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.subtitleLabel.frame);
}
とか、もっと一般的な
override func layoutSubviews() {
super.layoutSubviews()
for view in subviews {
guard let label = view as? UILabel where label.numberOfLines == 0 else { continue }
label.preferredMaxLayoutWidth = CGRectGetWidth(label.frame)
}
}
2015年1月更新
残念ながらこれはまだ必要なようです。ここでは、レイアウト処理の迅速なバージョンを紹介します。
tableView.tableHeaderView = header
header.setNeedsLayout()
header.layoutIfNeeded()
header.frame.size = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
tableView.tableHeaderView = header
これをUITableViewの拡張に移すと便利なことがわかりました。
extension UITableView {
//set the tableHeaderView so that the required height can be determined, update the header's frame and set it again
func setAndLayoutTableHeaderView(header: UIView) {
self.tableHeaderView = header
self.tableHeaderView?.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
header.widthAnchor.constraint(equalTo: self.widthAnchor)
])
header.setNeedsLayout()
header.layoutIfNeeded()
header.frame.size = header.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
self.tableHeaderView = header
}
}
使用方法
let header = SCAMessageView()
header.titleLabel.text = "Warning"
header.subtitleLabel.text = "Warning message here."
tableView.setAndLayoutTableHeaderView(header)
関連
-
[解決済み] Cocoa Autolayout: コンテンツの抱擁 vs コンテンツの圧縮抵抗の優先順位
-
[解決済み] Cocoapodsの使用時にXcodeの警告を無視する
-
[解決済み】UIScrollView Scrollable Content Size Ambiguity
-
[解決済み] UIPageControlのページネーションドットの色を変更するにはどうしたらよいですか?
-
[解決済み] APNSの.pemファイルを作成する?
-
[解決済み] UITableViewのセクション間のスペースを小さくする
-
[解決済み] iPhone UIViewアニメーションのベストプラクティス
-
[解決済み] カメラロールに画像を保存する方法を教えてください。
-
[解決済み] iOS: HTTP POST リクエストを実行するには?
-
[解決済み] iOS11でuitableviewが変な挙動をする。ナビゲーションプッシュアニメーションでセルがスクロールアップする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] hw.machine」識別子の信頼性を確認する方法は?
-
[解決済み】@try - Objective-Cのcatchブロック
-
[解決済み] UINavigationControllerに右ボタンを追加する方法は?
-
[解決済み] APNSの.pemファイルを作成する?
-
[解決済み] xcodeでiOSアプリのアーカイブを生成できない
-
[解決済み] モバイルSafari(iPhone)でテキストエリアのインナーシャドウを除去する
-
[解決済み] 静的ライブラリのObjective-Cカテゴリ
-
[解決済み] iPhoneのTableViewのCellの右側に小さな矢印を追加する
-
[解決済み] 空のUITableViewを処理する。フレンドリーなメッセージを表示する
-
[解決済み] アプリを提出する前にitunesのリンクを取得する