【发布时间】:2019-07-15 22:14:29
【问题描述】:
我在我的应用程序中创建了这个自定义视图,用户可以通过拖动来扩展它,并包含案例的所有动画。为了清楚起见,我想重现几乎相同的 IOS 控制中心动画。到目前为止,我设法获得了几乎所有内容,从手指拖动视图时的扩展动画到使角变圆的可能性。
现在,事实是,除了可以拖动视图之外,我还想在用户在展开之间松开手指时实现动画,以使视图恢复到原来的高度或完成扩张。为此,我使用了用户停止拖动时视图的位置。
当我尝试为UIView.layer.mask 设置动画时,问题就开始了。通过网上的一些研究,我发现了CABasicAnimation 类,并在一个函数中实现了它:
func animateExpandableView(withDuration duration: Double) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeInEaseOut))
let maskAnimation = CABasicAnimation(keyPath: "mask")
maskAnimation.fromValue = profileView.layer.mask
let bounds = profileView.frame
let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.bottomLeft, .bottomRight], cornerRadii: CGSize(width: 8.0, height: 8.0))
let maskLayer = CAShapeLayer()
maskLayer.frame = bounds
maskLayer.path = maskPath.cgPath
maskAnimation.toValue = maskLayer
maskAnimation.duration = duration
profileView.layer.mask = maskLayer
profileView.layer.add(maskAnimation, forKey: "mask")
CATransaction.commit()
}
顺便说一句,这不起作用,并且面具的变化没有动画。 我在执行中哪里出错了?
有人建议我从另一个问题中检查此链接;我没有发现它很有用,因为尽管它不适用于我的情况,但答案是用 C 而不是 Swift 编写的。
【问题讨论】:
-
为什么要过滤约束列表?为什么不在创建属性时简单地在属性中存储对约束的引用?使用
UIViewPropertyAnimator您可能会发现这更容易 -
@Paulw11 我还是个菜鸟,我会听从你的建议 :)...什么是 UiPropertyViewAnimator,为什么我不应该使用 Uiview.animate?谢谢
-
好的,谢谢,我会检查
-
再问一个问题...如何创建对约束的引用?
标签: ios swift animation uiview mask