为什么ImageView.StartAnimating不会在主线程上设置动画

时间:2013-03-26 15:32:36

标签: ios multithreading animation xamarin.ios uiimageview

我正在尝试在TableView单元格中制作一系列图标图像,但我无法让ImageView.StartAnimating工作。 TableView位于UITableViewController中,并且有一个TableViewDataSource文件,其中设置了TableView内容。

在我的TableViewDataSource中,我设置了PNG数组并配置了各种动画首选项。

UIImage image0 = GetImage("Images/image_at_0_degrees@2x.png");
UIImage image45 = GetImage("Images/image_at_45_degrees@2x.png");
UIImage image90 = GetImage("Images/image_at_90_degrees@2x.png");
UIImage image135 = GetImage("Images/image_at_135_degrees@2x.png");
UIImage[] images = new UIImage[] { image0, image135, image90, image45 };

cell.ImageView.AnimationImages = images;
cell.ImageView.AnimationDuration = 0.5;
cell.ImageView.AnimationRepeatCount = 0;
cell.ImageView.Image = image0;

// cell.ImageView.StartAnimating(); // If called here images will animate

如果我在TableViewDataSource中调用StartAnimating(在上面的示例中已注释掉),则图像将按顺序生成动画。

但它在我的UITableViewController中,我想让图像动画以响应某个被触发的事件。

在ViewWillAppear中,我得到了对特定单元格ImageView

的引用
UITableViewCell cell = TableView.CellAt(NSIndexPath.FromRowSection(0, 2));
imagetoAnimate = (UIImageView)cell.ContentView.ViewWithTag(ICON_TAG);

然后当事件被引发时,我在主线程上调用StartAnimating(我添加了Console.WriteLines只是为了确认InvokeOnMainThread块中的代码确实在主线程上执行 - 它是。还有,所有其他代码之前在InvokeOnMainThread块里面。)

private void Application_Event()
{      
    Console.WriteLine("Running on Thread ID {0}. Is Main thread? {1}", Thread.CurrentThread.ManagedThreadId, NSThread.IsMain); // Returns false

    InvokeOnMainThread(delegate 
    { 

        Console.WriteLine("Running on Thread ID {0}. Is Main thread? {1}", Thread.CurrentThread.ManagedThreadId, NSThread.IsMain); // Returns true

        imageToAnimate.StartAnimating(); // If called here images don't animate
        UpdateCount();
        UpdateStatus(); 
    });
}

这是我想念的简单事情。如果您需要更多信息,请与我们联系。

提前致谢。

更新#1

UpdateCount和UpdateStatus方法包含TableView.ReloadData语句,这些语句似乎干扰了ImageView.StartAnimating(注释掉两行都允许动画继续进行)。

有没有人听说过此类事情发生过?

更新#2

移动将ImageView.AnimationImages设置为GetCell方法并进入UITableViewController的代码块解决了这个问题。

UIImage image0 = GetImage("Images/image_at_0_degrees@2x.png");
UIImage image45 = GetImage("Images/image_at_45_degrees@2x.png");
UIImage image90 = GetImage("Images/image_at_90_degrees@2x.png");
UIImage image135 = GetImage("Images/image_at_135_degrees@2x.png");
UIImage[] images = new UIImage[] { image0, image135, image90, image45 };

cell.ImageView.AnimationImages = images;
cell.ImageView.AnimationDuration = 0.5;
cell.ImageView.AnimationRepeatCount = 0;
cell.ImageView.Image = image0;

完成此操作并取消注释TableView.ReloadData语句后,当调用ImageView.StartAnimating时,动画会正常进行。

1 个答案:

答案 0 :(得分:0)

调用UITableView.ReloadData将重新加载所有单元格,并且会在您的表格视图源上再次调用GetCell

这可能会阻止动画发生。