在[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
我看到实际的图像视图移动,但带有叠加的“绘制”版本只会立即转到目标值。我希望能够告诉“绘制”版本去实际的选择器视图。我怎么能这样做?
当我NSLog
selector.frame.origin.x
时,我注意到该值始终为0
。我可以看到选择器是屏幕上的动画,所以给出了什么?
答案 0 :(得分:7)
这里有一些错误:
不要尝试使用drawRect进行逐帧动画,它实际上不够快,因为Core Graphics不是硬件加速的(它在模拟器上可能看起来很好 - 它不会在一个真实的设备)。
如果要为图像的矩形设置动画,请使用UIImageView并使用普通的UIView动画方法为其设置动画。
如果你看不到使用普通动画方法实现动画的方法,你可以使用displayLink逐帧进行,但是你仍然应该通过更新UIImageView的框架而不是绘制图像来完成绘图。直接在drawRect。
UIView动画不直接为view.frame
属性设置动画。如果将view.frame
设置为立即设置为您指定的任何值,即使在设置动画时也是如此。尝试将逐帧动画同步到另一个视图的帧时,因为它为其设置了动画效果。
要获取动画视图框架的实际动画中间值,您需要查看view.layer.presentationLayer.frame
- 这是动画的值。 view.frame
实际上只是一个返回view.layer.modelLayer.frame
的getter方法,它始终设置为上次设置的值view.frame
。