5

いくつかの異なるコントロールを持つビューを作成しようとしていますが、ビューを垂直方向にのみスクロールしたいと思います。自動レイアウトを使用しているので、手動でサイズを指定する必要はありません(それができることはわかっていますが、リリースノートによると私が理解していることからUIScrollViewそうする必要はありません)。

したがって、単純なView Controller(.xibファイルなし)を作成し、initメソッドに次を追加するだけで、ラベルが折り返され(ラベルが折り返される)、ビューが垂直方向にスクロールすると予想されますが、これはそうではありません。ケース:

- (id)init {
    self = [super init];
    if (self) {

        UIScrollView *_scrollView = [UIScrollView new];
        [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];

        UILabel *label1 = [UILabel new];
        UILabel *label2 = [UILabel new];

        [label1 setTranslatesAutoresizingMaskIntoConstraints:NO];
        [label2 setTranslatesAutoresizingMaskIntoConstraints:NO];

        [label1 setNumberOfLines:0];
        [label2 setNumberOfLines:0];

        [label1 setPreferredMaxLayoutWidth:240];
        [label2 setPreferredMaxLayoutWidth:240];

        NSString *sampleText = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
        [label1 setText:sampleText];
        [label2 setText:sampleText];

        [self.view addSubview:_scrollView];
        [_scrollView addSubview:label1];
        [_scrollView addSubview:label2];

        NSArray *constraints;
        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_scrollView)];
        [self.view addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_scrollView)];
        [self.view addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label1]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1)];
        [_scrollView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label2]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label2)];
        [_scrollView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)];
        [_scrollView addConstraints:constraints];
    }

    return self;
}

私が奇妙だと思うこのコードからのいくつかの結果があります。すべての制約を適用する必要があるメソッド(スーパーコールの後)にscrollviewheightを記録するとviewDidLayoutSubviews、高さは0を報告します。また、幅が予想とは異なる数を報告していることも奇妙です。最初の制約のために、スーパービューの幅を報告することを期待します(必要と思われる優先順位でその制約内の幅を強制しようとしましたが、それでも機能しませんでした)。

私が理解しているように、UIScrollViewのコンテンツサイズは、そのコンテンツの固有のサイズによって設定する必要がありますが、それは起こっていないようです。

だから、誰かが欠けているものを知っていますか?

4

1 に答える 1

9

質問に対する回答を得るために、Apple のサポートに連絡しました。このコードの問題は、UIScrollView 内に含まれるオブジェクトが、固有のコンテンツ サイズを決定するために上下両方に垂直に固定される必要があることです。したがって、次のコード行

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)];
[_scrollView addConstraints:constraints];

次のように変更する必要があります。

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)];
[_scrollView addConstraints:constraints];

彼らはまた、基本的な「init」が指定された初期化子ではないいくつかのオブジェクトで「new」キーワードを使用していたことを指摘しました。それは私の特定の問題とは何の関係もありませんでしたが、オブジェクトが無効な状態になる可能性があるため、それを避けるべきであると彼らは指摘しました。

于 2012-12-18T19:23:05.820 に答える