如果我对视图应用转换,那么iPad Air上的视图移动会发生滞后。它看起来像CALayer中的隐式动画。 我创建了测试project。它应该在iPad模拟器上执行。 这是我用于应用转换的代码:
CGAffineTransform transform = CGAffineTransformIdentity;
if (_transformSwitch.on)
{
transform = CGAffineTransformRotate(CGAffineTransformMakeScale(2.0, 2.0), M_PI / 3.0);
}
self.frameView.transform = transform;
这是我用于应用移动的代码:
CGPoint transition = [_panRecognizer translationInView:self.view];
CGPoint newCenter = CGPointMake(_startCenter.x + transition.x, _startCenter.y + transition.y);
self.frameView.center = newCenter;
如何使用应用的转换移动视图并避免使用动画?
UPD 我找到了一个通过计时器调用移动的解决方案,但是如果我用手指移动框架,我对动画有问题。 我设置了一个视图的中心,用[CATransaction begin] [CATransaction commit]包装它:
[CATransaction begin];
[CATransaction setValue:@(YES) forKey:kCATransactionDisableActions];
_destinationIndicatorView.center = center;
self.frameView.center = center;
[CATransaction commit];
我找到了奇怪的解决方案,但我想知道为什么它是一个有效的解决方案? 我添加了这个方法setNeedsDisplay,它解决了我的问题。 (如果我使用drawRect方法在屏幕上添加任何视图,并在其上调用setNeedsDisplay视图,它也解决了我的问题):
[CATransaction begin];
[CATransaction setValue:@(YES) forKey:kCATransactionDisableActions];
_destinationIndicatorView.center = center;
[self.frameView setNeedsDisplay];
self.frameView.center = center;
[CATransaction commit];
我已经更新了我的项目。
UPD2 这种滞后只发生在带有视网膜显示屏的iPad上(例如iPad Air)。我创建了一个小视频来说明问题:https://yadi.sk/i/rAneCEFmjjEej
答案 0 :(得分:0)
我认为您可以在此代码中包含更改:
[CATransaction begin];
[CATransaction disableActions];
// Your changes to the UI elements...
[CATransaction commit];
答案 1 :(得分:0)
好吧,我已经玩过你的项目并找到了两件与你预期不会做的事情:
第一个是drawRect:
上的FrameView
:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
}
来自Apple:
此方法的默认实现不执行任何操作。子类 使用Core Graphics和UIKit等技术来绘制他们的 view的内容应覆盖此方法并实现其绘图 代码在那里。如果您的视图设置,则无需覆盖此方法 它的内容以其他方式。例如,您不需要覆盖 如果您的视图只显示背景颜色或者您的视图,则此方法 view使用底层图层对象直接设置其内容。
第二个是错的(根据文档,它是正确的,见下文)在FrameView上重写- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
的返回值:您返回nil
(如{ {1}}引用虽然CoreAnimation实际上需要一个CALayerDelegate
的实例(在阅读NSNull
类引用时可能会假设)。由于文档中存在冲突,您的操作会导致意外结果。我正在谈论this和this。
P.S。结果,我在不使用CALayer
的情况下使其工作。不幸的是,我没有手动使用视网膜iPad,所以请查看我对GitHub项目的更改(我将创建一个包含所有更改的拉取请求)并告诉它是否解决了非预期的动画(假设已解决)问题和拖动滞后(需要检查真实iPad上的性能问题)。