9

わかりましたのでUIView、インターフェイス ビルダーを作成しました。私が使用AutoLayoutしていて、このビューの 1 つのサブビューが 4 つの側面すべてに固定されています。

これが私が理解していないことです。を使用してこの NIB ファイルをロードすると、loadNibNamed. 次に、ビューへの参照を取得します。このビューのフレームを設定しました。それでも、([ containerView viewWithTag:1] を使用して) サブビューにアクセスすると、フレームは自動的にサイズ変更されません。何を与える?親ビューのフレームを変更すると、サブビューのフレームも変更されないのはなぜですか?

意味がありません。

UIViewをロードしてフレームを設定し、すべてのサブビューを適切に調整できないのはなぜですか(特に私が使用しているのでAutoLayout!)?

編集:明確にするために、私がやりたいことはUIView、適切な制約を使用してIBで階層を定義し、AutoLayoutそのビューを画面にロードして表示できるようにすることだけですか? なぜこれが難しいのですか?

4

3 に答える 3

13

ビューのジオメトリを変更しても、UIKit はサブビューのジオメトリをすぐには更新しません。効率のために更新をバッチ処理します。

イベント ハンドラーを実行した後、UIKit は、画面上のウィンドウ階層にレイアウトが必要なビューがあるかどうかを確認します。見つかった場合は、レイアウトの制約 (ある場合) を解決してレイアウトし、layoutSubviews.

制約を解決してビューのサブビューをすぐにレイアウトしたい場合は、単にlayoutIfNeededビューに送信します。

someView.frame = CGRectMake(0, 0, 200, 300);
[someView layoutIfNeeded];
// The frames of someView.subviews are now up-to-date.
于 2013-09-20T05:20:16.960 に答える
1

私も同じ問題を抱えていました。スクロールビューに複数のUIViewを追加したいチュートリアルビューを作成していました。xib からフレームを取得しようとしている間、常に 320 が返されました。そのため、ページのオフセットが間違っていて、iPhone6 および 6plus でのビューが粗雑に見えました。

次に、純粋な自動レイアウト アプローチを使用しました。つまり、フレームを使用する代わりに、VFL を使用して制約を追加し、サブビューがスーパービューに正確に収まるようにしました。以下は、Xib から約 20 個の UIView を作成し、スクロールビューに適切に追加するコードのスナップショットです。

完全なコードはこちらScrollViewAutolayout

 Method to layout the childviews in the scrollview.
 @param nil
 @result layout the child views
 */
-(void)layoutViews
{
    NSMutableString *horizontalString = [NSMutableString string];
    // Keep the start of the horizontal constraint
    [horizontalString appendString:@"H:|"];
    for (int i=0; i<viewsArray.count; i++) {
        // Here I am providing the index of the array as the view name key in the dictionary
        [viewsDict setObject:viewsArray[i] forKey:[NSString stringWithFormat:@"v%d",i]];
        // Since we are having only one view vertically, then we need to add the constraint now itself. Since we need to have fullscreen, we are giving height equal to the superview.
        NSString *verticalString = [NSString stringWithFormat:@"V:|[%@(==parent)]|", [NSString stringWithFormat:@"v%d",i]];
        // add the constraint
        [contentScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalString options:0 metrics:nil views:viewsDict]];
        // Since we need to horizontally arrange, we construct a string, with all the views in array looped and here also we have fullwidth of superview.
        [horizontalString appendString:[NSString stringWithFormat:@"[%@(==parent)]", [NSString stringWithFormat:@"v%d",i]]];
    }
    // Close the string with the parent
    [horizontalString appendString:@"|"];
    // apply the constraint
    [contentScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:horizontalString options:0 metrics:nil views:viewsDict]];
}
于 2015-09-11T18:21:32.633 に答える