2014-12-20 5 views
2

CABasicAnimation을 사용하여 CALayer의 애니메이션 경계 속성에 다음 코드가 있습니다. 그러나 코드가 작동하지 않는 것 같습니다.keypath "bounds"가 작동하지 않는 CABasicAnimation

let fromValue = textLabel.layer.bounds 
    let toValue = CGRectMake(textLabel.layer.bounds.origin.x, textLabel.layer.bounds.origin.y, textLabel.layer.bounds.width, textLabel.layer.bounds.height + 50) 

    let positionAnimation = CABasicAnimation(keyPath: "bounds") 
    positionAnimation.fromValue = NSValue(CGRect: fromValue) 
    positionAnimation.toValue = NSValue(CGRect: toValue) 
    positionAnimation.duration = 1 
    positionAnimation.fillMode = kCAFillModeBoth 
    positionAnimation.removedOnCompletion = false 

    textLabel.layer.addAnimation(positionAnimation, forKey: "bounds") 
+0

그것이 작동하지 않는다는 증거는 무엇입니까? 레이블의 높이를 높이면 텍스트가 표시되는 방식이 변경되지 않으므로 어떤 차이가 있습니까? – matt

답변

8

코드가 실제로 작동합니다. 코드를 실행하고 Xcode에서 디버깅보기를 켜면 레이블의 높이가 증가한 것을 볼 수 있습니다. "문제"는 iOS 8의 UILabel이 계층 높이가 인위적으로이 방법으로 증가 된 후에도 같은 방식으로 그 자체 (텍스트와 배경이있는 경우 그 배경)를 그립니다. (레이블은 텍스트 내용을 기반으로하는 특수한 클리핑 영역으로 그려지기 때문입니다.)

자신에게이 사실을 입증하려면 일반 바닐라 UIView (컬러 배경 사용) 대신 라벨.

let fromValue = view2.layer.bounds.height 
    let toValue = view2.layer.bounds.height + 50 
    CATransaction.setDisableActions(true) 
    view2.layer.bounds.size.height = toValue 
    let positionAnimation = CABasicAnimation(keyPath: "bounds.size.height") 
    positionAnimation.fromValue = fromValue 
    positionAnimation.toValue = toValue 
    positionAnimation.duration = 1 
    view2.layer.addAnimation(positionAnimation, forKey: "bounds") 

당신은 그 것을 볼 수 있습니다 : - 나는 코드를 청소의 자유를 촬영했습니다 (당신이 fillModeremovedOnCompletion 당신이하고있는 방법을 오용해서는 안됩니다를 그냥 애니메이션이 무엇인지 이해의 부족을 보여줍니다) 완벽하게 작동합니다. 이제 view2textLabel으로 다시 변경하십시오. 그것은 여전히 ​​효과가 있습니다. 단지 볼 것이 없다는 것입니다. 당신은 어떤 일이 표시되지 않습니다

self.textLabel.layer.bounds.size.height += 50 

:

자신에게 이것을 증명하는 또 다른 방법은 전체 애니메이션을 드롭하고 바로 라벨의 층 높이를 변경하는 것입니다. 따라서 애니메이션에는 버그가 없습니다. 라벨이 그려지는 방식에 관한 것입니다.

당신은 계층 대신 보기을 변경하여 변경 볼 수 있습니다 :

self.textLabel.bounds.size.height += 50 

하나 추가 "문제"하지만, 애니메이션이 애니메이션되지 않는 것입니다. 라벨이 특별한 방법으로 그려지기 때문입니다.

그래서 당신이 그것을 달성하려고 시도하고 있다면, 당신은 다른 방식으로 그것을해야 할 것입니다. 색상이 지정된보기 앞에 명확한 레이블을 지정하고보기의 높이 변화를 애니메이션으로 나타낼 수 있습니다. 우리는 이미 그것을 증명했습니다.

+0

해답을 주셔서 감사합니다. 음, 애니메이션 자체가 UILabels에 대해 특별한 처리를하기 때문에 나타나지 않는다는 것을 깨달았습니다. 또한 fillMode 및 removeOnCompletion을 사용했습니다. 실제 레이어를 업데이트하고 애니메이션이 완료되면이를 수행하기를 원하기 때문입니다. – KSC