2012-02-06 46 views
1

在ios動畫期間[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 

我看到實際圖像視圖的舉動,但「繪製」版本覆蓋物僅立即轉到目標值。我希望能夠告訴「繪製」版本去實際選擇器視圖的任何位置。我怎樣才能做到這一點?

編輯

當我NSLogselector.frame.origin.x我注意到,該值始終0。我可以看到選擇器是屏幕上的動畫,那麼給出了什麼?

回答

7

有一些錯誤的位置:

  1. 不要嘗試做一幀一幀動畫與drawRect中,它真的不是這個速度不夠快,因爲核芯顯卡沒有硬件加速(也可能在模擬器上看起來不錯 - 它不會在真實的設備上)。

    如果要爲圖像的矩形設置動畫,請使用UIImageView並使用普通的UIView動畫方法進行動畫處理。

    如果你不能看到的方式使用普通的動畫的方法來實現自己的動畫,你可以做到這一點通過使用幀幀DisplayLink的,但你仍然應該只是更新一個UIImageView的框架,而不是繪製做你的圖紙圖像直接在drawRect中。

  2. UIView動畫不直接動畫view.frame屬性。如果您設置view.frame,即使設置動畫,它也會立即設置爲您指定的值。嘗試將逐幀動畫同步到另一個視圖的框架,因爲它爲其動畫製作動畫將不起作用。

    要獲得動畫視圖幀的實際中間動畫值,您需要查看view.layer.presentationLayer.frame而不是 - 這是動畫的值。 view.frame實際上只是一個返回view.layer.modelLayer.frame的getter方法,它始終設置爲view.frame最後設置的值。

+0

我正在處理'Overlay'混合模式。混合模式必須具有正確混合的背景。如果我在不同的視圖中執行選擇器圖像,那麼混合模式根本不起作用(這就是混合模式,因爲我相信你知道)。所以我試圖設法讓他們進入同一個UIObject,但只是讓選擇器移動的外觀。這是一個棘手的業務:( – Jacksonkr 2012-02-06 20:00:25

+0

僅供參考,我只是在ipad上運行這個,因爲我爲覆蓋動畫做了這麼小的一部分,所以它運行在全幀。謝謝你真棒的答案,你肯定是SOF的ios q &a。 – Jacksonkr 2012-02-06 20:18:26

+1

+1僅用於'view.layer.presentationLayer.frame'部分,非常有用 – 2013-10-30 03:17:17