2016-09-14 1 views
0

My ViewController имеет UIImageView (позволяет называть его img) как атрибут, а в начале он показывает img в полноэкранном режиме, то есть его размер представляет собой прямоугольник, подобный границам ViewController.Поворот прямоугольного UIImageView в круг

Я бы хотел сделать анимацию с img, сделав ее маленьким кругом (а не только прямоугольником с круговыми углами), а затем переместим его в какой-то угол ViewController.

Как я могу это достичь? Я предпочитаю не отправлять какой-либо код, потому что я уверен, что сделал это неправильно (я попытался превратить его в квадрат, а затем установил angleRadius (с шириной радиуса/2), затем сделав масштаб и переводя позицию сразу, но беспорядок и работает неправильно, поэтому давайте забудем об этом)

+2

взять ImageView с такой же высоты и ширины, и установите его свойство слоя: imageView.layer.masksToBounds = истинный imageView.layer.cornerRadius = img.frame.size.height/2 –

ответ

1

Ваше решение звучит хорошо для меня, но что может быть не так, заключается в том, что анимационный угловой радиус не поддерживается UIView.animate WithDuration, как показано в View Programming Guide for iOS. Поэтому результаты иногда не ожидаются.

Вы можете попробовать следующий код.

func animate() { 

    //Some properties that needs to be set on UIImageView 
    self.imageView.clipsToBounds = true 
    self.imageView.contentMode = .ScaleAspectFill 

    //Create animations 
    let cornerRadiusAnim = changeCornerRadiusAnimation() 
    let squareAnim = makeSquareAnimation() 
    let boundsAnim = changeBoundsAnimation() 
    let positionAnim = changePositionAnimation(CGPointMake(300,480)) 

    //Use group for sequenced execution of animations 
    let animationGroup = CAAnimationGroup() 
    animationGroup.animations = [cornerRadiusAnim, squareAnim, boundsAnim, positionAnim] 
    animationGroup.fillMode = kCAFillModeForwards 
    animationGroup.removedOnCompletion = false 
    animationGroup.duration = positionAnim.beginTime + positionAnim.duration 
    imageView.layer.addAnimation(animationGroup, forKey: nil) 

} 

func makeSquareAnimation() -> CABasicAnimation { 

    let center = imageView.center 
    let animation = CABasicAnimation(keyPath:"bounds") 
    animation.duration = 0.1; 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    animation.fromValue = NSValue(CGRect: imageView.frame) 
    animation.toValue = NSValue(CGRect: CGRectMake(center.x,center.y,imageView.frame.width,imageView.frame.width)) 
    animation.fillMode = kCAFillModeForwards 
    animation.removedOnCompletion = false 
    return animation 

} 

func changeBoundsAnimation() -> CABasicAnimation { 

    let animation = CABasicAnimation(keyPath:"transform.scale") 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    animation.fromValue = imageView.layer.mask?.valueForKeyPath("transform.scale") 
    animation.toValue = 0.1 
    animation.duration = 0.5 
    animation.beginTime = 0.1 
    animation.fillMode = kCAFillModeForwards 
    animation.removedOnCompletion = false 
    return animation 

} 

func changeCornerRadiusAnimation() -> CABasicAnimation { 

    let animation = CABasicAnimation(keyPath:"cornerRadius") 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    animation.fromValue = 0 
    animation.toValue = imageView.frame.size.width * 0.5 
    animation.duration = 0.1 
    animation.fillMode = kCAFillModeForwards 
    animation.removedOnCompletion = false 
    return animation 

} 

func changePositionAnimation(newPosition: CGPoint) -> CABasicAnimation { 

    let animation = CABasicAnimation(keyPath: "position") 
    animation.fromValue = NSValue(CGPoint: imageView.layer.position) 
    animation.toValue = NSValue(CGPoint: newPosition) 
    animation.duration = 0.3 
    animation.beginTime = 0.6 
    animation.fillMode = kCAFillModeForwards 
    animation.removedOnCompletion = false 
    return animation 
} 
+0

OMG я не знаю если бы я должен был сказать, что здесь, но я люблю тебя – Daniel

+0

@ Даниэль счастлив, что смогу помочь –

0

// Попробуй вот так, я надеюсь, что это сработает для тебя.

UIView.animateWithDuration(3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: {() -> Void in 

     img.layer.masksToBounds = true 
     img.layer.cornerRadius = img.frame.size.height/2 // here img must be in square shape (height == width) 

     }) { (finished : Bool) -> Void in 

} 
0

вариант 1 вызова ниже метода из кода

// UIimageView Circle 
class func roundImageView(imageView:UIImageView){ 
    imageView.layer.borderWidth = 1.0 
    imageView.layer.masksToBounds = false 
    //imageView.layer.borderColor = UIColor.whiteColor().CGColor 
    imageView.layer.cornerRadius = imageView.frame.size.width/2 
    imageView.clipsToBounds = true 
} 

вариант 2 делают определенные пользователем время выполнения атрибуты из раскадровки

view.layer.cornerRadius = 5.0f; 
view.layer.masksToBounds = NO; 

 Смежные вопросы

  • Нет связанных вопросов^_^