如何在iOS中为视图的移动设置动画?

时间:2013-01-02 23:36:29

标签: objective-c ios xcode arrays animation

我是一名非常初学的程序员,我正在努力寻找最简单的方法。我之前从未做过任何关于动画的事情。我想尝试在我的应用程序中为图像设置动画,但我遇到了一些问题。这是以前我建议使用的代码(来自不同的问题):

imageView.image = yourLastImage;  
// Do this first so that after the animation is complete the image view till show your last image.

NSArray * imageArray  = [[NSArray alloc] initWithObjects:
[UIImage imageNamed:@"image1.png"],  
[UIImage imageNamed:@"image2.png"],
[UIImage imageNamed:@"image3.png"],                         
[UIImage imageNamed:@"image4.png"],
nil]; 

// Note: here you may instead want to use something like [UIImage imageWithContentsOfFile:[self localImagePath:NO]] instead depending upon your targeted iOS version.



UIImageView * animatedImageView = [[UIImageView alloc] initWithFrame:
    CGRectMake(100, 125, 150, 130)];
animatedImageView.animationImages = imageArray;
animatedImageView.animationDuration = 1.1;
    myAnimation.animationRepeatCount = 1;
animatedImageView.contentMode = UIViewContentModeBottomLeft;

[self.view addSubview:animatedImageView];
[animatedImageView startAnimating];

嗯,首先,这是否实用?我想要动画从屏幕中间到屏幕底部的内容。这是否意味着我必须拥有500张图像,每张图像相距1个像素?什么是最佳像素间隔,使其看起来流畅均匀,不需要大量工作?有没有比上面的方式更好的动画方式?是否有一个程序可以帮助制作动画,以后可以添加到Xcode中?

另外,有人可以解释上面的代码吗?我是动画新手,我真的不明白这一切意味着什么。

对不起,如果这是一个愚蠢的问题,我在开幕式上说我是初学者。感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:30)

对于大多数动画,您只需更改UIView动画块内视图的属性即可。 UIView类文档列出了哪些属性是可动画的。

[UIView animateWithDuration:0.5f animations:^{
    aView.frame = CGRectOffset(aView.frame, 0, 250); 
}];

这是一个示例项目,演示了按下按钮时如何触发动画。您可以将此动画代码放在许多其他位置,因此除非您提供有关所需内容的更多详细信息,否则您的问题在哪里放置代码的答案不是很好。

https://github.com/MaxGabriel/AnimationDemonstration

您正在采取的方法是为UIImageView制作动画。我从来没有这样做,但我的理解是,就像制作动画GIF一样。对于移动视图或淡出视图等内容,您需要使用上面显示的动画块方法。

答案 1 :(得分:1)

在iOS中制作动画很简单。

{{1}}

答案 2 :(得分:0)

以下代码对我有用,可以在打开键盘或其他东西时移动视图。

public class MyPagedListAdapter extends PagedListAdapter<String, MyPagedListAdapter.VH> {

    private LayoutInflater inflater;

    protected MyPagedListAdapter(LayoutInflater inflater) {
        super(DIFF_CALLBACK);
        this.inflater = inflater;
    }

    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_text, parent, false);
        return new VH(view);
    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        holder.setData(getItem(position));
    }

    public class VH extends RecyclerView.ViewHolder {

        private final TextView txt;

        public VH(@NonNull View itemView) {
            super(itemView);
            txt = itemView.findViewById(R.id.txt);
        }

        public void setData(String text) {
            txt.setText(text);
        }
    }

    private static DiffUtil.ItemCallback<String> DIFF_CALLBACK = new DiffUtil.ItemCallback<String>() {
        @Override
        public boolean areItemsTheSame(@NonNull String oldItem, @NonNull String newItem) {
            return oldItem.equalsIgnoreCase(newItem);
        }

        @Override
        public boolean areContentsTheSame(@NonNull String oldItem, @NonNull String newItem) {
            return oldItem.equalsIgnoreCase(newItem);
        }
    };

}

希望也可以帮助您:D