【问题标题】:transition animation on only a part of the screen仅在屏幕的一部分上的过渡动画
【发布时间】:2011-02-24 21:03:17
【问题描述】:

我在我的 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];

感谢任何关于我应该采取何种方式的线索。

【问题讨论】:

    标签: iphone cocoa-touch uiview core-animation uiimage


    【解决方案1】:

    嗯,一个简单的方法可能是这样(对bottomImage重复):

    第一次在方法中加载时不要释放 topView, 但在你的 .h 文件中声明它, 并使用 tempView:

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

    这样您就可以调用它们来移动它们并在加载新图像时删除它们

    然后在.m:

    编辑:一些更正(参见 coco 的 cmets):

    [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];
    }
    

    【讨论】:

    • 酷!一些变化和一个问题: [a] CGRect topframe = CGRectMake((0.0f + 320), 0.0f, 320.0f, 240.0f); [b] 第 4 行 = tempView.image = topImage; [c] 第 11 行:topView.center = CGPointMake(topView.center.x - 320, topView.center.y); [d] 我的问题:为什么 topView 从 superview 中删除?如果我不这样做,它会正常工作,而且它在逻辑上对我来说没有意义.. 谢谢你
    • 如果你不这样做,它只会被覆盖(如果没有移到左边)或移开,所以你不会看到它,但这并不意味着它不存在。您必须将其删除才能“杀死”它,否则如果继续添加图像,您将拥有很多图像...目标是屏幕上只有 2 个图像,您不需要保留旧图像...所以我的代码这样做:对动画使用临时图像(屏幕上有 3 个图像的唯一情况),最后删除旧图像(topView),然后让指针 topView 指向新Img (tempImg)。现在你有 2 个指向 newImg 的指针,你可以“杀死” tempImg。
    • 如果您不想释放并将它/它们保存在内存中,那么您不必执行所有代码来交换一些图像...您只需使用 2 UIScrollView 即可(一个顶部和一个底部)并将图像并排放置在其中,这是一种简单的方法,虽然您正在寻找一个几乎无限的图像加载器,但您每次都需要释放内存......。 ..对于您的更改:是的,您是对的,当然...对不起,tks...我会花时间用新的编辑来纠正它们...
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2012-06-10
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多