5

UIScrollView をメイン ビューに動的に追加し、小さな UIView オブジェクトで埋めています。contentSize をデバイスの解像度よりも大きく設定していますが、デバイスの向きを変更するまでスクロールできません。

向きを変更する前にスクロールするにはどうすればよいですか?

後で編集:

問題は、追加している特定のサブビュー、より具体的には、それらのサブビューにいくつかの制約を追加することから発生することに気付きました:

サブビューを追加するコードは次のとおりです (メソッドは約 10 ~ 20 回呼び出されます)。

-(void) addShelve:(NSInteger) index
{
FSShelf *shelf = [[FSShelf alloc] initWithFrame:CGRectMake(0, index * [FSConstants getShelfVerticalDistance], 0, 0)];
[shelves addObject:shelf];

[shelfView addSubview:shelf];
[shelf addShelfConstraints];
}

FSShelf は UIView のサブクラスであり、shelfView は UIScrollView のサブクラスです。

で追加された制約は次のaddShelfContraintsとおりです。

    [self.superview addConstraint:[FSUtils getWidthConstraintFor:self.superview with:self constant: -2 * ([FSConstants getShelveMargin])]];
    [self addConstraint:[FSUtils getSelfHeightConstraintFor:self constant:30]];
    [self.superview addConstraint:[FSUtils getCenterXConstraintFor:self.superview with:self constant:0]];

制約を追加するための FSUtils クラスのメソッド:

+ (NSLayoutConstraint *)getSelfHeightConstraintFor:(UIView *)view constant:(CGFloat)constant
{
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view
                                                                  attribute:NSLayoutAttributeHeight
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:nil
                                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                                 multiplier:1.0
                                                                   constant:constant];
    return constraint;
}

+ (NSLayoutConstraint *)getCenterXConstraintFor:(UIView *)superView with:(UIView *)subView constant:(CGFloat)constant
{
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:subView
                                                                  attribute:NSLayoutAttributeCenterX
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:superView
                                                                  attribute:NSLayoutAttributeCenterX
                                                                 multiplier:1.0
                                                                   constant:constant];

    return constraint;
}

+ (NSLayoutConstraint *)getWidthConstraintFor:(UIView *)superView with:(UIView *)subView constant:(CGFloat)constant
{
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:subView
                                                                  attribute:NSLayoutAttributeWidth
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:superView
                                                                  attribute:NSLayoutAttributeWidth
                                                                 multiplier:1.0
                                                                   constant:constant];
    return constraint;
}

これらの制約に何か問題があることに気づきましたか?

4

4 に答える 4

1

シングルタップで、このように作成してみてください

UIScrollView * scrollview = [[UIScrollView alloc]init];
CGRect viewFrame = self.view.frame;
[scrollview setFrame:viewFrame];
[scrollview setShowsHorizontalScrollIndicator:YES];
[scrollview setShowsVerticalScrollIndicator:YES];

UIView * view = [[UIView alloc]init];
CGRect viewDoubleFrame = CGRectMake(viewFrame.origin.x,viewFrame.origin.y,viewFrame.size.width * 2,viewFrame.size.height *2);
[view setFrame:viewDoubleFrame];
[view setBackgroundColor:[UIColor darkGrayColor]];

// add your additional components here

[scrollview setContentSize:CGSizeMake(view.frame.size.width,view.frame.size.height)];
[scrollview addSubview:view];

[self.view addSubview:scrollview];
于 2013-03-22T12:39:29.450 に答える
1

あなたが配置しようとしている制約shelfView(私はあなたのUIScrollViewだと思います)は賢明ではありません。幅がゼロで x 原点がゼロのシェルフ サブビューを作成FSShelf *shelf = [[FSShelf alloc] initWithFrame:CGRectMake(0, index * [FSConstants getShelfVerticalDistance], 0, 0)];し、すぐにその同じゼロ幅から一定の定数を引いたもの (つまり、shelfView には負の幅が必要) を持ち、サブビューと同じ中心 x を持つように、shelfView を制約しようとしていますが、シェルフビューはまだ幅がゼロで、x の原点がゼロです! シェルフ サブビューに割り当てている唯一の制約は、その高さです。実際、ここには何かが欠けていると思います。投稿したコードでは、シェルフ サブビューの幅は常にゼロです。実際に画面にシェルフのサブビューが表示されていますか?

とにかく、ここに私のアドバイスshelfViewがあります。それぞれのシェルフ サブビューに基づいて制約を追加しようとすることは、命題を失うことです。この場合、制約は満たされないように見えます。一般に、スーパービューをどのように配置するかについてすべてのサブビューが常に正確に一致するように細心の注意を払っていない限り、さまざまな制約が満たされないことがわかります。

これらすべての代わりに、制約コードを忘れてください。あなたがやろうとしていることは非常に簡単です。ShelfView には、画面のサイズ (またはアプリケーション フレーム、おそらくそのスーパービューの境界) に等しいフレームが想定されており、シェルフ ビューは垂直方向に配置され、それらの間にいくつかの垂直マージンがあり、いくつかの水平マージンが分離されていると想定されています。画面の端からそれらを。今と同じようにビューを追加しますが、制約呼び出しを追加する代わりに、ビュー コントローラーにメソッドを[self.view setNeedsLayout];実装します。viewDidLayoutSubviews次のようなものが必要です。

- (void)viewDidLayoutSubviews {
    const CGRect rootViewBounds = self.view.bounds;
    shelfView.frame = rootViewBounds;

    const CGFloat kHorizontalMargin = [FSConstants getShelveMargin];
    const CGFloat kVerticalDistancePerShelf = [FSConstants getShelfVerticalDistance];
    const CGFloat kShelfHeight = 30.0;
    const NSUInteger shelvesCount = [shelves count];
    for (NSUInteger j = 0; j < shelvesCount; j++) {
        UIView *shelf = [shelves objectAtIndex:j];
        shelf.frame = CGRectMake(kHorizontalMargin,
                                 j * kVerticalDistancePerShelf,
                                 CGRectGetWidth(rootViewBounds) - 2.0 * kHorizontalMargin,
                                 kShelfHeight);
    }
    shelfView.contentSize = CGSizeMake(CGRectGetWidth(rootViewBounds), (shelvesCount - 1) * kVerticalDistancePerShelf + kShelfHeight);
}
于 2013-03-24T15:04:10.530 に答える
0

自動レイアウトを使用している場合、コンテンツのサイズを変更するだけでは十分ではないことに注意してください。Scroll View は別の方法でレイアウトされます。stack Hereに関するこの質問が非常に役立つことがわかりました。したがって、自動レイアウトを使用しているかどうかを確認し、それに適応するか、無効にします。
これが役に立てば幸いです、Andrea

[編集]
iOS6 以上のデバイスを対象とする場合は、コレクション ビューを使用しないでください。それらは素晴らしいレイアウト機能を備えた非常にクールなものであり、Peter のおかげで、iOS>=4.3 の代替品を手に入れることができました。私が理解したところでは、彼らはあなたの要件に合うことができました. ギットハブ

于 2013-03-22T14:51:01.500 に答える