我尝试翻转一个带有圆角(边框)的视图。
视图的圆角实现方式如下: private extension UIView {
func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
let mask = _round(corners: corners, radius: radius)
addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth)
}
@discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer {
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
return mask
}
func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) {
let borderLayer = CAShapeLayer()
borderLayer.path = mask.path
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.strokeColor = borderColor.cgColor
borderLayer.lineWidth = borderWidth
borderLayer.frame = bounds
layer.addSublayer(borderLayer)
}
}
翻转效果由以下代码实现:
UIView.transition(with: self, duration: 0.5, options: [.transitionFlipFromRight], animations: {}, completion: {_ in })
在翻转过程中,当转换正在运行时,边框不再呈圆角状态。
请问有人知道如何实现翻转效果,而不会失去圆角呢?
更新
如果我采用this的方法,我会遇到几个问题。
现在翻转是这样实现的:
let flipAnimation = CABasicAnimation(keyPath: "transform")
flipAnimation.fromValue = NSValue(caTransform3D: CATransform3DIdentity)
flipAnimation.toValue = NSValue(caTransform3D: CATransform3DMakeRotation(.pi, 0,1,0))
flipAnimation.fillMode = kCAFillModeBoth
self.layer.add(flipAnimation, forKey: "flip")
self.layer.zPosition = -1000
CATransaction.commit()
问题
- 动画不如UIView.transition流畅
- 效果会镜像视图上的内容——我不需要这个(见下图)
- 旋转结束后不够精确,有时视图位置会错位(见下图)
更新:解决方案 我在有圆角的彩色视图周围添加了一个容器视图,并翻转了容器,而不是彩色视图。然后一切都正常工作了!