0

Cocoa Touch アプリを左または右にスワイプして履歴の位置を変更できるようにしました。アニメーションは、Android の「カード」スタイルのようなものです。左にスワイプ (<--) すると、現在の画面イメージが邪魔にならないように移動し、その下に前のビューが表示されます。

これは問題なく動作しますが、反対方向 (-->) にスワイプして戻るには、前の画像を取得し、それを現在のビューに移動する必要があります。さて、前の画像のみを保存するとこれが機能しましたが、<--数回行った場合、十分な画像がありません。

したがって、解決策は明らかです。NSMutableArray を使用し、配列の先頭に最新の画像を投げるだけです。反対方向にスワイプするときは、配列の最初の画像を使用します。ただし、アニメーションを開始しても画像は表示されません。何も示していないだけです。必要なメソッドは次のとおりです。

-(void)animateBack {
    CGRect screenRect = [self.view bounds];

    UIImage *screen = [self captureScreen];

    [imageArray insertObject:screen atIndex:0]; //Insert the screenshot at the first index
    imgView = [[UIImageView alloc] initWithFrame:screenRect];
    imgView.image = screen;
    [imgView setHidden:NO];
    NSLog(@"Center of imgView is x = %f, y = %f", imgView.center.x, imgView.center.y);
    CGFloat startPointX = imgView.center.x;
    CGFloat width = screenRect.size.width;
    NSLog(@"Width = %f", width);
    imgView.center = CGPointMake(imgView.center.x, imgView.center.y);

    [self.view addSubview: imgView];
    [self navigateBackInHistory];

    [UIView animateWithDuration:.3 animations:^{
        isSwiping = 1;
        imgView.center = CGPointMake(startPointX - width, imgView.center.y);


    } completion:^(BOOL finished){
        // Your animation is finished
        [self clearImage];
        isSwiping = 0;
    }];
}

-(void)animateForward {
    CGRect screenRect = [self.view bounds];

    //UIImage *screen = [self captureScreen];
    UIImage *screen = [imageArray objectAtIndex:0]; //Get the latest image
    imgView = [[UIImageView alloc] initWithFrame:screenRect];
    imgView.image = screen;
    [imgView setHidden:NO];
    NSLog(@"Center of imgView is x = %f, y = %f", imgView.center.x, imgView.center.y);
    CGFloat startPointX = imgView.center.x;
    CGFloat width = screenRect.size.width;
    NSLog(@"Width = %f", width);
    imgView.center = CGPointMake(imgView.center.x - width, imgView.center.y);

    [self.view addSubview: imgView];

    [UIView animateWithDuration:.3 animations:^{
        isSwiping = 1;
        imgView.center = CGPointMake(startPointX, imgView.center.y);


    } completion:^(BOOL finished){
        // Your animation is finished
        [self navigateForwardInHistory];
        [self clearImage];
        isSwiping = 0;
    }];

}



-(void)clearImage {
    [imgView setHidden:YES];
    imgView.image = nil;
}

-(void)navigateBackInHistory {
    [self saveItems:self];
    [self alterIndexBack];
    item = [[[LEItemStore sharedStore] allItems] objectAtIndex:currentHistoryIndex];
    [self loadItems:self];
}

-(void)navigateForwardInHistory {
    [imageArray removeObjectAtIndex:0]; //Remove the latest image, since we just finished swiping this way.
    [self saveItems:self];
    [self alterIndexForward];
    item = [[[LEItemStore sharedStore] allItems] objectAtIndex:currentHistoryIndex];
    [self loadItems:self];
}

imgView はクラス レベルの UIImageView であり、imageArray はクラス レベルの配列であることに注意してください。

何か案は?ありがとう。

編集

それを初期化するための私の .m の上部にあるコードは次のとおりです。それでも機能しません。

.....
NSMutableArray *imageArray;

- (void)viewDidLoad
{
    [super viewDidLoad];
    imageArray = [imageArray initWithObjects:nil];
4

1 に答える 1

1

配列を作成するのを忘れたようです。適切なタイミングで次のようなことができます (ARC を想定):

imageArray = [NSMutableArray array];

それがうまくいったことをうれしく思います。

于 2013-01-29T17:43:25.987 に答える