анимация перехода только на части экрана - PullRequest
0 голосов
/ 25 февраля 2011

В приложении для iPhone отображаются два изображения: одно сверху, другое снизу. Они покрывают весь экран. Пользователь жестом смахивания может изменить любое из изображений в зависимости от того, с чего началось смахивание.

Я хочу, чтобы изображение изменилось с анимированным переходом. В настоящее время он работает без анимации или с переходом всего экрана. Можно ли сделать так, чтобы переход происходил на части экрана?

Я загружаю изображения впервые (в viewDidLoad) таким образом:

// top image
UIImage *topImage = [UIImage imageNamed:@"top1.png"];
CGRect topframe = CGRectMake(0.0f, 0.0f, 320.0f, 240.0f);
UIImageView *topView = [[UIImageView alloc] initWithFrame:topframe];
topView.image = topImage;
[self.view addSubview:topView];
[topView release];

// bottom image
UIImage *bottomImage = [UIImage imageNamed:@"bottom1.png"];
CGRect bottomframe = CGRectMake(0.0f, 240.0f, 320.0f, 240.0f);
UIImageView *bottomView = [[UIImageView alloc] initWithFrame:bottomframe];
bottomView.image = bottomImage;
[self.view addSubview:bottomView];
[bottomView release];

Когда я обнаружив пролистывание и обнаружив, какое из двух изображений должно быть изменено, я вызываю процедуру, подобную этой:

- (void)changeTopImage:(NSString *)newImage {
    UIImage *topImage = [UIImage imageNamed:newImage];
    CGRect topframe = CGRectMake(0.0f, 0.0f, 320.0f, 240.0f);
    UIImageView *topView = [[UIImageView alloc] initWithFrame:topframe];
    topView.image = topImage;
    [self.view addSubview:topView];
    [topView release];
}

По сути, я постоянно загружаю изображения друг на друга. Это лучший способ сделать это, особенно с точки зрения управления памятью?

Все остальное, что я пробовал, используя такие методы, как приведенные ниже, делает весь переход экрана:

[UIView beginAnimations:nil context:nil];
...
[UIView commitAnimations];

Спасибо за любые подсказки, по которым мне следует идти по этому пути.

1 Ответ

0 голосов
/ 25 февраля 2011

ну, простой способ может быть таким (повторите для bottomImage):

не выпускайте topView при первой загрузке в вашем методе, но объявите это в вашем .h файле, и тоже используйте tempView:

@interface YourClass: UIViewController{
    UIImageView *topView;
    UIImageView *tempView;
}

таким образом вы можете вызвать их, чтобы переместить и удалить, когда вы загружаете новое изображение

затем в .m:

РЕДАКТИРОВАТЬ: некоторые исправления (см. Комментарии Коко):

[a] [b] строка 4 = [c] строка 11:

- (void)changeTopImage:(NSString *)newImage {
    UIImage *topImage = [UIImage imageNamed:newImage];
    //CGRect topframe = CGRectMake(0.0f, 0.0f, (320.0f + 320), 240.0f);
    CGRect topframe = CGRectMake((0.0f + 320), 0.0f, 320.0f, 240.0f);
    tempView = [[UIImageView alloc] initWithFrame:topframe];
    //topView.image = topImage;
    tempView.image = topImage;
    [self.view addSubview:tempView];
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

    [UIView beginAnimations:@"animation" context:NULL];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationDelegate:self];
                tempView.center = topView.center;
                // do this to push old topView away, comment next line if wanna new image just cover it
                //topView.center =  CGPointMake(topView.x - 320, topView.y);
                topView.center = CGPointMake(topView.center.x - 320, topView.center.y);
                // call a method when animation has finished:
        [UIView setAnimationDidStopSelector:@selector(endOfAnimation:finished:context:)];
    [UIView commitAnimations];
}

    - (void)endOfAnimation:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{

        [topView removeFromSuperview];
        topView = tempView;
        [tempView release];
        tempView = nil;
        [[UIApplication sharedApplication] endIgnoringInteractionEvents];
    }

- (void)dealloc {
    if (tempView != nil) {
        [tempView release];
    }
    [topView release];

    [super dealloc];
}
...