2013-03-26 100 views
2

我试图在TableView单元格中设置一系列图标图像的动画,并且我无法使ImageView.StartAnimating正常工作。 TableView位于UITableViewController中,并且有一个TableViewDataSource文件用于设置TableView内容。为什么ImageView.StartAnimating不会在主线程上动画

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

UIImage image0 = GetImage("Images/[email protected]"); 
UIImage image45 = GetImage("Images/[email protected]"); 
UIImage image90 = GetImage("Images/[email protected]"); 
UIImage image135 = GetImage("Images/[email protected]"); 
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 

如果我请StartAnimating在TableViewDataSource(在上面的示例注释)的图像中的动画序列。

但它在我的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(); 
    }); 
} 

这一定是一些简单的我失踪。如果您需要更多信息,请与我们联系。

在此先感谢。

UPDATE#1

使用UpdateCount和UpdateStatus方法含有看起来与ImageView.StartAnimating会干扰TableView.ReloadData语句(注释出两条线允许动画进行)。

有没有人听说过这种类型的事情发生之前?

更新#2

移动码块,设置ImageView.AnimationImages出GetCell方法并进入的UITableViewController解决了问题。

UIImage image0 = GetImage("Images/[email protected]"); 
UIImage image45 = GetImage("Images/[email protected]"); 
UIImage image90 = GetImage("Images/[email protected]"); 
UIImage image135 = GetImage("Images/[email protected]"); 
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时动画正常进行。

+0

如果你在你调用'imageToAnimate.StartAnimating()'的地方放置了一个断点,它是非空的并且具有所有适当的值,例如'AnimationImages'填充了,对吗? – jonathanpeppers 2013-03-26 16:58:31

+0

是的,imageToAnimate不为null,AnimationImages包含四个图像,isAnimating = false(当StartAnimating调用时,动画会翻转为true)。 – billmaya 2013-03-26 18:18:06

+0

GetCell被调用或表视图后立即重新加载? – jonathanpeppers 2013-03-26 18:26:08

回答

0

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

这可能会停止发生动画。

相关问题