5

背景の画像をループさせて無限スクロールのように見せるためのビューコントローラが欲しいのですが。たとえば、下の画像を使用すると、左端と右端が完全に一致し、無限のスクロールの外観を与えるために使用されます。誰かが私がこれを設定する方法を知っていますか?私はいくつかの調査を行い、道に迷っています。皆さん、ありがとうございました!

無限スクロール画像

4

2 に答える 2

8

私ならこうします。 編集読者の演習として残すのではなく、どちらの方向にもパンする方法を示すように更新しました...

@property (nonatomic, assign) BOOL keepGoing;
@property (nonatomic, assign) BOOL panRight;
@property (nonatomic, strong) UIImageView *imageViewA;
@property (nonatomic, strong) UIImageView *imageViewB;

- (void)getReady {

    // init theImage
    UIImage *theImage = [UIImage imageNamed:@"theImage.png"];

    // get two copies of the image
    self.imageViewA = [[UIImageView alloc] initWithImage:theImage];
    self.imageViewB = [[UIImageView alloc] initWithImage:theImage];

    // place one in view, the other, off to the right (for right to left motion)
    NSInteger direction = (self.panRight)? 1 : -1;
    self.imageViewA.frame = self.view.bounds;
    self.imageViewB.frame = CGRectOffset(self.view.bounds, direction*self.imageViewA.bounds.size.width, 0.0);

    [self.view addSubview:self.imageViewA];
    [self.view addSubview:self.imageViewB];
    self.keepGoing = YES;
}

- (void)go {
    NSInteger direction = (self.panRight)? 1 : -1;
    CGFloat offsetX = -direction*self.imageViewA.bounds.size.width;

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.imageViewA.frame = CGRectOffset(self.imageViewA.frame, offsetX, 0);
        self.imageViewB.frame = CGRectOffset(self.imageViewB.frame, offsetX, 0);
    } completion:^(BOOL finished) {
        if (self.keepGoing) {
            // now B is where A began, so swap them and reposition B
            UIImageView *temp = self.imageViewA;
            self.imageViewA  = self.imageViewB;
            self.imageViewB = temp;
            self.imageViewB.frame = CGRectOffset(self.view.bounds, direction*self.view.bounds.size.width, 0.0);
            // recursive call, but we don't want to wind up the stack
            [self performSelector:@selector(go) withObject:nil afterDelay:0.0];
        }
    }];
}

実行するには、panRight プロパティを設定してから、[self getReady];andを呼び出します[self go];

ほとんど非同期で実行されます。止めるには、set self.keepGoing = NO;.

于 2013-01-21T02:52:31.167 に答える
0

簡単な方法の 1 つは、イメージを画面の幅の 2 倍にすることです。0,0 に配置します。必要に応じて左右にアニメーション化します。原点が x 軸上の画像幅の半分の負の値より小さくなるとすぐに右端の端に到達し、原点が x 軸の 0 より上になるとすぐに左端に到達します。そんなときは、原点をリセットするだけです。

于 2013-01-21T02:52:58.893 に答える