2012-06-19 28 views
5

Yuvarlatılmış bir dikdörtgenin genişliğini canlandırmaya çalışıyorum, sorun daha büyük genişlikten ince genişliğe geçtiğinde, animasyon bir "sapma kolaylığı atlama" yapar. İşte (iOS) Yuvarlatılmış dikdörtgen, shapeLayer ile nasıl animasyon yapılır?

kod:

shapeLayer = [CAShapeLayer layer]; 
shapeRect = CGRectMake(0.0f, 0.0f, 150.0f, 200.0f); 
[shapeLayer setBounds:shapeRect]; 
[shapeLayer setPosition:CGPointMake(iniPosX, 80.0f)]; 
[shapeLayer setFillColor:[[UIColor blackColor] CGColor]]; 
[shapeLayer setStrokeColor:[[UIColor clearColor] CGColor]]; 
[shapeLayer setLineWidth:1.0f]; 
[shapeLayer setLineJoin:kCALineJoinRound]; 
[shapeLayer setOpacity:0.2]; 
path = [UIBezierPath bezierPathWithRoundedRect:shapeRect cornerRadius:15.0]; 
[shapeLayer setPath:path.CGPath]; 
[self.layer addSublayer:shapeLayer]; 

Ve animasyon başlattığınızda:

- (void)adjustSelectorToPosAndSize:(float)posX andWidth:(float)width 
{ 
    shapeRect = CGRectMake(0.0f, 0.0f, width, 200.0f); 
    [shapeLayer setBounds:shapeRect]; 
    [shapeLayer setPosition:CGPointMake(posX, 80.0f)]; 
    path = [UIBezierPath bezierPathWithRoundedRect:shapeRect cornerRadius:15.0]; 
    [shapeLayer setPath:path.CGPath]; 
} 

yanlış yapıyorum? muhtemelen her üç animasyonlar birlikte şunları yapabilirsiniz olmasını istediğim için

CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath: @"path"]; 
anim.fromValue = (id) fromPath.CGPath; 
anim.toValue = (id) toPath.CGPath; 
anim.duration = 1.0; 
[layer addAnimation: anim forKey: @“resize”]; 

:

CAShapeLayer yolunun özelliği canlandırılabilir olmasına rağmen, sınırları ve pozisyon gibi pek örtülü yapmaz
+0

Düzeltme Alexis için teşekkürler. – murb83

cevap

3

Bunu yalnızca bir yuvarlak dikdörtgen için kullanıyorsanız, CAShapeLayer ile yapmak oldukça karmaşık görünüyor. Neden bir CALayer'i the cornerRadius properly setiyle kullanmıyorsunuz?

Köşeyi cornerRadius kümesiyle ayarlamak ince ayar yapacaktır. fillColorbackgroundColor oldu gibi

özelliklerin bazıları isim değişti ve strokeColor:

myLayer = [CALayer layer]; 
shapeRect = CGRectMake(0.0f, 0.0f, 150.0f, 200.0f); 
[myLayer setBounds:shapeRect]; 
[myLayer setPosition:CGPointMake(iniPosX, 80.0f)]; 
[myLayer setBackgroundColor:[[UIColor blackColor] CGColor]]; 
[myLayer setBorderColor:[[UIColor clearColor] CGColor]]; 
[myLayer setBorderWidth:1.0f]; 
[myLayer setOpacity:0.2]; 
[myLayer setCornerRadius:15.0]; 
[self.layer addSublayer:myLayer]; 

basitçe çerçeveyi (yol hariç) Önemli

- (void)adjustSelectorToPosAndSize:(float)posX andWidth:(float)width 
{ 
    shapeRect = CGRectMake(0.0f, 0.0f, width, 200.0f); 
    [myLayer setBounds:shapeRect]; 
    [myLayer setPosition:CGPointMake(posX, 80.0f)]; 
} 

zincirleme yapılır animasyon ve lineWidth, borderColor ve borderWidth vb. oldu.

+0

Teşekkürler! Ama bir animasyon yapmaz, anlıkdır. – murb83

+0

Sadece denedim. Varsayılan 0,3 dakikalık animasyonu kullanarak animasyon yapar. Katmanla başka bir şey yapıyor musun? –

+0

Animasyonu özelleştirmek istiyorsanız, bunu açıkça yapmanız gerekiyor –

3

, açık bir animasyon yapmak zorunda senin şekli daha sonra içerik veya çocuk sahibi olmayan

CABasicAnimation* anim1 = [CABasicAnimation animationWithKeyPath: @"position"]; 
anim1.fromValue = [NSValue valueWithCGPoint: fromPosition]; 
anim1.toValue = [NSValue valueWithCGPoint: toPosition]; 
anim1.duration = 1.0; 

CABasicAnimation* anim2 = [CABasicAnimation animationWithKeyPath: @"bounds"]; 
anim2.fromValue = [NSValue valueWithCGRect: fromBounds]; 
anim2.toValue = [NSValue valueWithCGRect: toBounds]; 
anim2.duration = 1.0; 

CABasicAnimation* anim3 = [CABasicAnimation animationWithKeyPath: @"path"]; 
anim3.fromValue = (id) fromPath.CGPath; 
anim3.toValue = (id) toPath.CGPath; 
anim3.duration = 1.0; 

CAAnimationGroup* animG = [CAAnimationGroup animation]; 
animG.animations = [NSArray arrayWithObjects: anim1, anim2, anim3, nil]; 
animG.duration = 1.0; 
[layer addAnimation: animG forKey:@"resize"]; 

, bunun yerine bir CALayer kullanmak mümkün olabilir:

hepsini açık ve gruplanmış yapmak
CALayer* rectLayer = [CALayer layer]; 
rectLayer.masksToBounds = YES; 
rectLayer.bounds = startBounds; 
rectLayer.backgroundColor = [[UIColor blackColor] CGColor]; 
rectLayer.cornerRadius = 15.0; 
[self.layer addSublayer: rectLayer]; 

// Then later implicitly animate the bounds: 
rectLayer.bounds = newBounds; 
+0

Teşekkürler! Kodunuzu test ediyorum, testi bitirdiğinizde size söylüyorum. – murb83

+0

Üzgünüm, ama iyi çalışmıyor, sanırım yanlış bir şey yapıyorum, ancak katman istediğim yere gitmiyor, animasyon yaptığımda referans noktasının farklı olduğunu düşünüyorum. Üzgünüm ingilizcem iyi değil. Animasyonları kullanma şeklim gerçekten benim ilgim, grup animasyonlarında bana yeni bir yol açtın. ^^ – murb83