在iPad Air上应用转换的视图移动(带有视网膜显示)

时间:2014-08-20 09:59:50

标签: ios uiview cgaffinetransform ipad

如果我对视图应用转换,那么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

2 个答案:

答案 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类引用时可能会假设)。由于文档中存在冲突,您的操作会导致意外结果。我正在谈论thisthis

P.S。结果,我在不使用CALayer的情况下使其工作。不幸的是,我没有手动使用视网膜iPad,所以请查看我对GitHub项目的更改(我将创建一个包含所有更改的拉取请求)并告诉它是否解决了非预期的动画(假设已解决)问题和拖动滞后(需要检查真实iPad上的性能问题)。