0

私は現在、を学ぼうとしていUIScrollViewます。演習として、UIViewテキストを表示するラベルが付いたsが必要であり、それらのビューがその中にあるようにしUIScrollViewます。これを行うには、2つmutableArrayのがあります。1つにはテキストが含まれ、もう1つにはUIViewsが含まれます。以下は、これらの配列を初期化するメソッドです。

- (NSMutableArray *)postViewsArray
{
    if (_postViewsArray == nil) _postViewsArray = [[NSMutableArray alloc] init];
    return _postViewsArray;
}

- (NSMutableArray *)postsArray
{
    if (_postsArray == nil) _postsArray = [[NSMutableArray alloc] init];
    return _postsArray;
}

次に、これら2つの配列に値を入力します。postsArray私は静的なテキストのみを配置しました。しかし、postViewsArrayNSNullはプレースホルダーとして使用しました。これは、最適化の目的、特に将来的に画像を含むビューをロードする必要がある場合のメモリ管理のためです。以下は、これらのアレイを設定する方法です。

- (void) setupPostsArray {
    [self.postsArray addObject:@"Hello"];
    [self.postsArray addObject:@"You are doing good"];
    [self.postsArray addObject:@"By this exercise"];
    [self.postsArray addObject:@"In scroll views, paging enabled :)"]; 
}

- (void) setupPostViewsArray {
    for (int i = 0; i < [self.postsArray count]; i++) {
        [self.postViewsArray addObject:[NSNull null]];
    } 
}

そこに、簡単です。それでは、もっと難しい部分に取り掛かりましょう。したがって、ここのloadMyPagesメソッドでは、最初に、を初期化し、scrollViewを設定してcontentSize、トップレベルビューのサブビューとして追加します。これはself.viewです。ここでは、スワイプできる「ページ」、つまりコンテンツ、背景色の作成も繰り返します。そこにそれがある。

ただし、アプリを実行すると、viewスワイプできるものしか表示されません。そして、viewsこのスクロールビューにはさらに3つが収まるように見えました。作成されているNSLogを確認するためにsを実行しましたが、デバッグ領域にログが表示されているため、正常に機能しているように見えました。私が見ることができるのは私のの最後の値を持っていることに注意してください。友人は、他のが並べて表示されるのではなく、重なっているのではないかと疑っています。pagesubviewsviewpostArrayview

ここで私にいくつかの光を当ててください:)以下は私のloadMyPages方法です、そしてあなたたちが挑戦に挑戦しているなら、おそらくこれを見てください。

- (void) loadMyPages
    {
        NSLog(@"loads view");
        CGRect pagingScrollViewFrame = [[UIScreen mainScreen] bounds];

        self.pagingScrollView = [[UIScrollView alloc] initWithFrame:pagingScrollViewFrame];

        self.pagingScrollView.contentSize = CGSizeMake(pagingScrollViewFrame.size.width * [self.postsArray count], pagingScrollViewFrame.size.height);


        [self.view addSubview:self.pagingScrollView];

        // iteration to enumerate creating of UIViews
        for (int i = 0; i < [self.postsArray count]; i++) {

            NSLog(@"Creating views?");

            UIView *pageView = [self.postViewsArray objectAtIndex:i];

                if ((NSNull *) pageView == [NSNull null]) {


                    // create a new UIView
                    UIView *page = [[UIView alloc] initWithFrame:self.view.bounds];

                    page.backgroundColor = [UIColor lightGrayColor];

                    // set text label
                    self.postLabel.text = [self.postsArray objectAtIndex:i];

                    // add the label to the created UIView
                    [page addSubview:self.postLabel];

                    // then lastly, add each element of the postViewsArray as a subview of the pagingScrollView
                    [self.postViewsArray replaceObjectAtIndex:i withObject:page];

                    [self.pagingScrollView addSubview:[self.postViewsArray objectAtIndex:i]];

                    NSLog(@"this view %@ has this post value: %@", page, [page subviews]);
                    NSLog(@"subviews of scrollview: %@", [self.pagingScrollView subviews]);
            }
        }
    }
4

2 に答える 2

1

私の理解によれば、iOSのデフォルトの写真アプリのように、トランプを並べて配置するようにビューを水平にレイアウトしてから、次から次へとスクロールする必要があります。

これを行うには、各ビューに、ビューのフレームまたはscrollViewフレームの幅に等しいx原点差値が必要です。ただし、現在のコード

[[UIView alloc] initWithFrame:self.view.bounds]

各ビューに同じ原点を設定し、オーバーラップします。コードを次のように変更します

[[UIView alloc] initWithFrame:(i*320), 0, yourWidth, yourHeight];

このi係数により、x値が増加し、後続の各ビューが前のビューのすぐ隣に配置されます。

注:ニーズに合わせて、320と0をx、y値として調整します

于 2012-08-06T10:21:15.387 に答える
1

各ビューに提供しているフレームが適切ではないため、ビューが重なっています: UIView *page = [[UIView alloc] initWithFrame:self.view.bounds];

各ビューが同じフレームを取得しているためです。

これの代わりに、次のようにフレームを提供する必要があります。

UIView *page1 = [[UIView alloc] initWithFrame:self.view.bounds];

UIView *page2 = [[UIView alloc] initWithFrame:CGRectMake(page1.frame.origin.x+page1.frame.size.width, 0, page1.frame.size.width, page1.frame.size.height)];

等々。

私が伝えたいことを理解していただければ幸いです。

For ループの前に、いくつかの CGRect 変数を作成します。

CGRect theViewFrame = CGRectZero;

for ループ内でページ フレームを提供し、次のように theViewFrame を初期化します。

page.frame = CGRectMake(theViewFrame.origin.x+self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height);
    theViewFrame = pageView.frame;

したがって、ループが反復されるたびに、 theViewFrame には最新のビュー フレームが含まれます。

于 2012-08-06T10:06:33.027 に答える