同步或在串行队列中使用动画更新 UI
update UI with animation synchronously or in serial queue
我有自定义构建菜单,可以推送或弹出视图。例如 menu1 推送一个视图。如果按下 menu2,则删除上一个视图并显示其他视图。
推动和弹出动画。如何用动画连续 update/push/pop 视图?它不应该忽略任何菜单选择
我用了dispatch_queue_t
和NSOperationQueue
都没有用,就好像它忽略了uiview动画一样。 self.uiOperationQueue
有 1 个作为最大并发操作。
[self.uiOperationQueue addOperationWithBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self updateViewsForSelection:menuType];
});
}];
使用调度队列:
self.uiUpdateQueue = dispatch_queue_create("ui-updateQueue", NULL);
dispatch_async(self.uiUpdateQueue, ^{
[self updateViewsForSelection:menuType];
});
所以基本上 [self updateViewsForSelection:menuType]
是用不同的菜单和带有持续时间的 uiview 动画调用的。我做错了什么?
可以将 animation blocks
添加到数组中并使用 completion block
一个接一个地执行它们
-(void)executeAnimationsInArray:(NSArray *)array atIndex:(int)index
{
[UIView animateWithDuration:1 animations:array[index] completion:^(BOOL finished) {
if (index < array.count - 1)
{
[self executeAnimationsInArray:array atIndex:index+1];
}
}];
}
可以这样用
id block1 = ^(void) {
imgView.frame = CGRectOffset(imgView.frame, 10, 10);
};
id block2 = ^(void) {
imgView.frame = CGRectOffset(imgView.frame, -10, -10);
};
[self executeAnimationsInArray:@[block1, block2] atIndex:0];
我有自定义构建菜单,可以推送或弹出视图。例如 menu1 推送一个视图。如果按下 menu2,则删除上一个视图并显示其他视图。 推动和弹出动画。如何用动画连续 update/push/pop 视图?它不应该忽略任何菜单选择
我用了dispatch_queue_t
和NSOperationQueue
都没有用,就好像它忽略了uiview动画一样。 self.uiOperationQueue
有 1 个作为最大并发操作。
[self.uiOperationQueue addOperationWithBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self updateViewsForSelection:menuType];
});
}];
使用调度队列:
self.uiUpdateQueue = dispatch_queue_create("ui-updateQueue", NULL);
dispatch_async(self.uiUpdateQueue, ^{
[self updateViewsForSelection:menuType];
});
所以基本上 [self updateViewsForSelection:menuType]
是用不同的菜单和带有持续时间的 uiview 动画调用的。我做错了什么?
可以将 animation blocks
添加到数组中并使用 completion block
-(void)executeAnimationsInArray:(NSArray *)array atIndex:(int)index
{
[UIView animateWithDuration:1 animations:array[index] completion:^(BOOL finished) {
if (index < array.count - 1)
{
[self executeAnimationsInArray:array atIndex:index+1];
}
}];
}
可以这样用
id block1 = ^(void) {
imgView.frame = CGRectOffset(imgView.frame, 10, 10);
};
id block2 = ^(void) {
imgView.frame = CGRectOffset(imgView.frame, -10, -10);
};
[self executeAnimationsInArray:@[block1, block2] atIndex:0];