2016-09-14 141 views
0

我的ViewController有一個UIImageView(讓它命名爲img)作爲屬性,並且在開始時,它將全屏顯示img,即它的大小是一個類似於ViewController邊界的矩形。將矩形UIImageView變成一個圓形

我想用img做一個動畫,使它變成一個小圓圈(不只是一個圓角的矩形),然後將它移動到ViewController的某個角落。

我該如何做到這一點?我寧願不發送任何代碼因爲我很確定我做了錯誤的方式(我試圖把它變成一個正方形,然後設置一個角半徑(半徑寬度爲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

@Daniel快樂,我可以幫助 –

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;