2014-07-16 19 views
11

Bir daireyi bir kareye dönüştürmeye çalışıyorum ya da tam tersi var. Ancak beklendiği gibi animasyon yapmaz. G/bir karenin bütün köşeler animasyon olmak ister aynı anda morphed ama ne olsun şudur olacaktır:iOS'tan orta/kare biçime kadar animate/morph şekil

enter image description here

Ben şekil özelliğine animasyon için CAShapeLayer ve CABasicAnimation kullanın. vb, benim görünümün tabakaların birine daire yolunu uygulamak

- (UIBezierPath *)squarePathWithCenter:(CGPoint)center size:(CGFloat)size 
{ 
    CGFloat startX = center.x-size/2; 
    CGFloat startY = center.y-size/2; 

    UIBezierPath *squarePath = [UIBezierPath bezierPath]; 
    [squarePath moveToPoint:CGPointMake(startX, startY)]; 
    [squarePath addLineToPoint:CGPointMake(startX+size, startY)]; 
    [squarePath addLineToPoint:CGPointMake(startX+size, startY+size)]; 
    [squarePath addLineToPoint:CGPointMake(startX, startY+size)]; 
    [squarePath closePath]; 
    return squarePath; 
} 

dolgu ayarlayın: İşte

- (UIBezierPath *)circlePathWithCenter:(CGPoint)center radius:(CGFloat)radius 
{  
    UIBezierPath *circlePath = [UIBezierPath bezierPath]; 
    [circlePath addArcWithCenter:center radius:radius startAngle:0 endAngle:M_PI/2 clockwise:YES]; 
    [circlePath addArcWithCenter:center radius:radius startAngle:M_PI/2 endAngle:M_PI clockwise:YES]; 
    [circlePath addArcWithCenter:center radius:radius startAngle:M_PI endAngle:3*M_PI/2 clockwise:YES]; 
    [circlePath addArcWithCenter:center radius:radius startAngle:3*M_PI/2 endAngle:M_PI clockwise:YES]; 
    [circlePath closePath]; 
    return circlePath; 
} 

kare yol: Burada

Ben daire yolu oluşturmak nasıl Mükemmel çizer. Sonra gestureRecognizer seçicisi içinde oluşturup aşağıdaki animasyonu çalıştırın:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"]; 
    animation.duration = 1; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

animation.fromValue = (__bridge id)(self.stateLayer.path); 
     animation.toValue = (__bridge id)(self.stopPath.CGPath); 
self.stateLayer.path = self.stopPath.CGPath; 

[self.stateLayer addAnimation:animation forKey:@"animatePath"]; 

Eğer buradan öneri takip circlePathWithCenter:radius: ve squarePathWithCenter:size: fark gibi (segmentler ve kontrol noktalarının aynı sayıda olması): Smooth shape shift animation

animasyon yukarıdan görevde sonra daha iyi görünüyor ama yine de ben basit CALayer ile bunu biliyor elde etmek :(

istediğiniz biri değil ve daha sonra bir set kare/dikdörtgen bir daire yapmak için cornerRadius uygun düzey ve cornerRadius özelliği bundan sonra daire için kare değiştirmek için ama CAShapeLayer ve path animasyon ile yapmak bile mümkün olsa bile son derece merak ediyorum.

Yardım için şimdiden teşekkür ederiz!

+0

görünüyor/questions/17429797/smooth-shape-shift-animation], animasyonlara dayanarak - –

+0

hmm'ye bir göz atmaya değer olabilir. Bu olabilir - Soruyu biliyorum ve kabul edilen yanıttan öneriyi takip ettim ama yine de jus öldü benim için bitir. Animasyonumun biraz daha iyi olduğu için yardımcı olduğunu düşündüğüm aynı sayıda segment/kontrol noktam var, oradan bir tane var ama eşiğin nasıl geliştirileceğine dair hiçbir fikri yok. – fgeorgiew

cevap

7

Oyun alanında bir süre oynadıktan sonra, her yayın sadece bir değil, bezier yoluna iki parça eklediğini fark ettim. Dahası, closePath numaralı telefonu arayarak iki tane daha ekleyebiliriz. Bu nedenle segmentlerin sayısını tutarlı tutmak için, kare yoluma sahte segmentler ekledim. Kod Swift’de, ama bence önemli değil.

func circlePathWithCenter(center: CGPoint, radius: CGFloat) -> UIBezierPath { 
    let circlePath = UIBezierPath() 
    circlePath.addArcWithCenter(center, radius: radius, startAngle: -CGFloat(M_PI), endAngle: -CGFloat(M_PI/2), clockwise: true) 
    circlePath.addArcWithCenter(center, radius: radius, startAngle: -CGFloat(M_PI/2), endAngle: 0, clockwise: true) 
    circlePath.addArcWithCenter(center, radius: radius, startAngle: 0, endAngle: CGFloat(M_PI/2), clockwise: true) 
    circlePath.addArcWithCenter(center, radius: radius, startAngle: CGFloat(M_PI/2), endAngle: CGFloat(M_PI), clockwise: true) 
    circlePath.closePath() 
    return circlePath 
} 

func squarePathWithCenter(center: CGPoint, side: CGFloat) -> UIBezierPath { 
    let squarePath = UIBezierPath() 
    let startX = center.x - side/2 
    let startY = center.y - side/2 
    squarePath.moveToPoint(CGPoint(x: startX, y: startY)) 
    squarePath.addLineToPoint(squarePath.currentPoint) 
    squarePath.addLineToPoint(CGPoint(x: startX + side, y: startY)) 
    squarePath.addLineToPoint(squarePath.currentPoint) 
    squarePath.addLineToPoint(CGPoint(x: startX + side, y: startY + side)) 
    squarePath.addLineToPoint(squarePath.currentPoint) 
    squarePath.addLineToPoint(CGPoint(x: startX, y: startY + side)) 
    squarePath.addLineToPoint(squarePath.currentPoint) 
    squarePath.closePath() 
    return squarePath 
} 

enter image description here

+0

iyi bir keşif iki nokta, objektif-c versiyonu yaptı. –

0

ederim o da önceden tanımlanmış bir "morph" animasyon vardır ve entegre etmek kolaydır, kütüphane CanvasPod önerebilir. Ayrıca, web sitesi canvaspod.io'daki örnekleri de inceleyebilirsiniz.

2

Bunun eski bir soru olduğunu biliyorum, ancak bu birilerine yardımcı olabilir.

Bu efekti elde etmek için köşe yarıçapını canlandırmanın daha iyi olduğunu düşünüyorum.

let v1 = UIView(frame: CGRect(x: 100, y: 100, width: 50, height: 50)) 
    v1.backgroundColor = UIColor.green 
    view.addSubview(v1) 

animasyonu: @Danchoys cevap dayanarak

let animation = CABasicAnimation(keyPath: "cornerRadius") 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    animation.fillMode = kCAFillModeForwards 
    animation.isRemovedOnCompletion = false 
    animation.fromValue = v1.layer.cornerRadius 
    animation.toValue = v1.bounds.width/2 
    animation.duration = 3 
    v1.layer.add(animation, forKey: "cornerRadius") 
0

, işte burada Objective-C içindir.

bilgi itiliyor sonraki ViewController olan 60px ve infoVC bir düğme: Bu soruya [http://stackoverflow.com aynı sorun yaşıyorsunuz gibi

UIBezierPath * maskPath = [UIBezierPath new]; 
    [maskPath addArcWithCenter:info.center radius:15.0f startAngle:DEGREES_TO_RADIANS(180) endAngle:DEGREES_TO_RADIANS(270) clockwise:true]; 
    [maskPath addArcWithCenter:info.center radius:15.0f startAngle:DEGREES_TO_RADIANS(270) endAngle:DEGREES_TO_RADIANS(0) clockwise:true]; 
    [maskPath addArcWithCenter:info.center radius:15.0f startAngle:DEGREES_TO_RADIANS(0) endAngle:DEGREES_TO_RADIANS(90) clockwise:true]; 
    [maskPath addArcWithCenter:info.center radius:15.0f startAngle:DEGREES_TO_RADIANS(90) endAngle:DEGREES_TO_RADIANS(180) clockwise:true]; 
    [maskPath closePath]; 

    UIBezierPath * endPath = [UIBezierPath new]; 
    [endPath moveToPoint:CGPointMake(0,0)]; 
    [endPath addLineToPoint:endPath.currentPoint]; 
    [endPath addLineToPoint:CGPointMake(w, 0)]; 
    [endPath addLineToPoint:endPath.currentPoint]; 
    [endPath addLineToPoint:CGPointMake(w, h)]; 
    [endPath addLineToPoint:endPath.currentPoint]; 
    [endPath addLineToPoint:CGPointMake(0, h)]; 
    [endPath addLineToPoint:endPath.currentPoint]; 
    [endPath closePath]; 

    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.frame = info.bounds; 
    maskLayer.path = maskPath.CGPath; 
    _infoVC.view.layer.mask = maskLayer; 

    CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"path"]; 
    animation.fromValue = (id)maskPath.CGPath; 
    animation.toValue = (id)endPath.CGPath; 
    animation.duration = 0.3f; 
    [maskLayer addAnimation:animation forKey:nil]; 
    [maskLayer setPath:endPath.CGPath]; 
İlgili konular