2016-09-06 1 views
0

Как CAShapelayer превращается из круга в квадрат (или наоборот) с CABasicAnimation?Как CAShapelayer преобразуется из круга в квадрат (или наоборот) с анимацией?

+0

Какая часть сложна? Техника анимации в целом или особенности маскировки фигуры? – Avi

+0

Я хочу преобразование из круга в квадрат сэр –

+1

Радиус угла отрегулирован вниз до нуля. – Avi

ответ

2

После выполнения некоторых работ вокруг, я закончились с этим

enter image description here

Первый глобальный объект UIBezierPath для квадратной и круглой дорожки, а также для объекта CAShapeLayer.

@implementation Demo{ 
     CAShapeLayer *shapeLayer; 
     UIBezierPath *sqPath; 
     UIBezierPath *crclePath; 
    } 

Теперь настроить shapeLayer и добавить слой, как показано ниже в viewDidLoad.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    shapeLayer = [CAShapeLayer layer]; 
    shapeLayer.strokeColor = [[UIColor redColor] CGColor]; 
    shapeLayer.lineWidth = 2; 
    shapeLayer.lineJoin = kCALineCapRound; 
    sqPath = [self makeSquare:self.view.center squareWidth:200]; 
    shapeLayer.path = [sqPath CGPath]; 
    crclePath = [self makeCircle:self.view.center radius:100]; 
    [self.view.layer addSublayer:shapeLayer]; 
} 

Ниже метод, который сделает идеальный квадрат

-(UIBezierPath*)makeSquare:(CGPoint)centrePoint squareWidth:(float)gain{ 
    float x=centrePoint.x-(gain/2); 
    float y=centrePoint.y-(gain/2); 
    UIBezierPath *apath = [UIBezierPath bezierPath]; 
    [apath moveToPoint:CGPointMake(x,y)]; 
    [apath addLineToPoint:apath.currentPoint]; 
    [apath addLineToPoint:CGPointMake(x+gain,y)]; 
    [apath addLineToPoint:apath.currentPoint]; 
    [apath addLineToPoint:CGPointMake(x+gain,y+gain)]; 
    [apath addLineToPoint:apath.currentPoint]; 
    [apath addLineToPoint:CGPointMake(x,y+gain)]; 
    [apath addLineToPoint:apath.currentPoint]; 
    [apath closePath]; 
    return apath; 
} 

Ниже метод позволяет сделать окружность

- (UIBezierPath *)makeCircle:(CGPoint)center radius:(CGFloat)radius 
{ 
    UIBezierPath *circlePath = [UIBezierPath bezierPath]; 
    [circlePath addArcWithCenter:center radius:radius startAngle:-M_PI endAngle:-M_PI/2 clockwise:YES]; 
    [circlePath addArcWithCenter:center radius:radius startAngle:-M_PI/2 endAngle:0 clockwise:YES]; 
    [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:-M_PI clockwise:YES]; 
    [circlePath closePath]; 
    return circlePath; 
} 

Наконец, анимация сделана в действии btnDone, которые используют CABasicAnimation для анимации преобразования от квадрата до круга или наоборот.

- (IBAction)btnDone:(id)sender { 
    btnDowrk.selected=!btnDowrk.selected; 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"]; 
    animation.duration = 1; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    if (btnDowrk.selected) { 
     animation.fromValue = (__bridge id)(sqPath.CGPath); 
     animation.toValue = (__bridge id)(crclePath.CGPath); 
     shapeLayer.path = crclePath.CGPath; 
    } 
    else{ 
     animation.fromValue = (__bridge id)(crclePath.CGPath); 
     animation.toValue = (__bridge id)(sqPath.CGPath); 
     shapeLayer.path = sqPath.CGPath; 
    } 
    [shapeLayer addAnimation:animation forKey:@"animatePath"]; 
} 
+0

Сообщите мне, что это работает для вас или нет? –

+0

это преобразует квадрат в круг и Vice verca, но не точно показывает в вашем ответе –

+0

, но я хочу, чтобы вы показали в exmaple –

1

Вы можете играть с cornerRadius. Например,

UIView *testView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 50, 50)]; 

CAShapeLayer *layer = [[CAShapeLayer alloc]initWithLayer:testView.layer]; // this is square layer 

layer.cornerRadius = 25.0; // this is round layer 

layer.cornerRadius = 0.0; // this is again square layer 

Вы можете переключать виды непосредственно из круглых в квадратные и квадратные, чтобы округлить, как и выше!

+0

, пожалуйста, прочтите мой вопрос –

+0

Я хочу квадрат для круга в CABasicAnimation Мне не нужен UIView –

+1

означает, что вы хотите изменить форму вида от квадрата до круга с анимацией? – Lion

1

Вот создать путь круг:

- (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; 
} 

Вот квадратный путь:

- (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; 
} 

анимация Часть

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"]; 
Смежные вопросы