ios截取动画值

ios截取动画值,ios,uiview,uiviewanimation,Ios,Uiview,Uiviewanimation,在[UIView animatWithDuration…]的ios动画期间,如何在动画期间截取动画值 以下是我当前的无效解决方案: #import "FooterSelectionView.h" #import <QuartzCore/QuartzCore.h> @implementation FooterSelectionView @synthesize displayLink; - (id)initWithCoder:(NSCoder *)aDecode

在[UIView animatWithDuration…]的ios动画期间,如何在动画期间截取动画值

以下是我当前的无效解决方案:

#import "FooterSelectionView.h"
#import <QuartzCore/QuartzCore.h>

@implementation FooterSelectionView

@synthesize displayLink;

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        
        selector = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"selector.png"]];
        [self addSubview:selector];
        
        [self setSelectorFrame:CGRectMake(700, 0, selector.frame.size.width, selector.frame.size.height)];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    UIImage *bg = [UIImage imageNamed:@"overlayArea.png"];
    [bg drawInRect:CGRectMake(0, 0, 957, 127) blendMode:kCGBlendModeNormal alpha:1];
    
    [selector.image drawInRect:selector.frame blendMode:kCGBlendModeOverlay alpha:1];
}

-(void)step {
    [self setNeedsDisplay];
    
    NSLog(@"%@", @"step");
}

- (void)setSelectorFrame:(CGRect)frame {
    displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
    [UIView animateWithDuration:5 animations:^{
        selector.frame = frame;
        //self.alpha = 0
    } completion:^(BOOL finished){
        [self setNeedsDisplay];
        
        [self.displayLink invalidate];
        self.displayLink = nil;
        NSLog(@"%@", @"stop");
    }];
}

@end
我看到实际的图像视图移动了,但是带有覆盖的绘制版本只会立即转到目标值。我希望能够告诉绘制的版本去哪里实际的选择器视图。我该怎么做

编辑
当我记录selector.frame.origin.x时,我注意到该值始终为0。我可以看到选择器在屏幕上是动画,那么会出现什么呢?

这里有一些错误:

不要尝试使用drawRect进行逐帧动画,它的速度确实不够快,因为核心图形不是硬件加速的,它在模拟器上看起来可能很好-在真实设备上不会

如果要为图像的矩形设置动画,请使用UIImageView并使用普通UIView动画方法为其设置动画

如果看不到使用普通动画方法实现动画的方法,可以使用displayLink逐帧进行,但仍应通过更新UIImageView的帧来进行绘制,而不是直接在drawRect中绘制图像

UIView动画不会直接设置view.frame属性的动画。如果设置view.frame,它会立即设置为您指定的任何值,即使在设置动画时也是如此。尝试将逐帧动画同步到另一个视图的帧(因为它为此设置了动画)将不起作用

要获取动画视图帧的实际中间动画值,您需要查看view.layer.presentationLayer.frame-这是动画的值。实际上,view.frame只是一个getter方法,返回view.layer.modelLayer.frame,它总是设置为view.frame上次设置的值


这里有几个错误:

不要尝试使用drawRect进行逐帧动画,它的速度确实不够快,因为核心图形不是硬件加速的,它在模拟器上看起来可能很好-在真实设备上不会

如果要为图像的矩形设置动画,请使用UIImageView并使用普通UIView动画方法为其设置动画

如果看不到使用普通动画方法实现动画的方法,可以使用displayLink逐帧进行,但仍应通过更新UIImageView的帧来进行绘制,而不是直接在drawRect中绘制图像

UIView动画不会直接设置view.frame属性的动画。如果设置view.frame,它会立即设置为您指定的任何值,即使在设置动画时也是如此。尝试将逐帧动画同步到另一个视图的帧(因为它为此设置了动画)将不起作用

要获取动画视图帧的实际中间动画值,您需要查看view.layer.presentationLayer.frame-这是动画的值。实际上,view.frame只是一个getter方法,返回view.layer.modelLayer.frame,它总是设置为view.frame上次设置的值


我正在处理叠加混合模式。混合模式必须具有背景才能正确混合。如果我在不同的视图中创建选择器图像,那么混合模式将根本不起作用,这就是混合模式的工作方式,我相信您知道。因此,我试图设计一种方法,使它们在同一个UIObject中,但只给出选择器移动的外观。这是一件棘手的事情:仅供参考,我只是在ipad上运行了这个,因为我正在做一个覆盖动画的小片段,它以全帧运行。感谢您精彩的回答,您无疑是SOF ios q&a的宝贵财富。仅就view.layer.presentationLayer.frame部分而言,您是非常有用的。您是一个救生伙伴。非常尊重第2点我正在处理叠加混合模式。混合模式必须具有背景才能正确混合。如果我在不同的视图中创建选择器图像,那么混合模式将根本不起作用,这就是混合模式的工作方式,我相信您知道。因此,我试图设计一种方法,使它们在同一个UIObject中,但只给出选择器移动的外观。这是一件棘手的事情:仅供参考,我只是在ipad上运行了这个,因为我正在做一个覆盖动画的小片段,它以全帧运行。感谢您精彩的回答,您无疑是SOF ios问答的宝贵财富。仅就view.layer.presentationLayer.frame部分而言,您是非常有用的。您是一个救生伙伴。非常尊重第2点