ios - 为什么我的 CAShapeLayer 不能正确地使用 UIView (w/gif) 设置动画?

标签 ios swift uiview uiviewanimation cashapelayer

enter image description here

好的,这就是它的运行方式。

灰色区域是一个 UIView,用 CAShapeLayer 遮盖了它。我附加了两个 UIBezierPath 并使用 Even Odd Rule 删除了该灰色区域的一部分。这就是为什么它显示一条线,就好像它在左侧显示一个半圆。

红色背景只是容器 View 。

现在我的问题是,当我为我的 UIView 设置动画时,就好像 mask 没有随着 UIView 的动画正确更新。

这是 UIView 动画部分:

func didCompleteItem() {
    self.bar.plainProgressBarLeftAnchor?.constant = self.bar.bounds.width * (self.completedItemCount*self.barMeterMultiplier) / self.bar.bounds.width - self.bar.meterCornerRadius
    UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .curveEaseInOut, animations: {
        self.bar.layoutIfNeeded()

    }, completion: nil)
}

现在,如果您需要查看 CAShapeLayer 是如何创建的,这是其中的 layoutSubviews 部分。

override func layoutSubviews() {
    super.layoutSubviews()

    backgroundColor = GradientColor(.leftToRight, frame: self.bounds, colors: GradientFlatRed())
    layer.masksToBounds = true
    layer.cornerRadius = meterCornerRadius

    createMask()

}

var shapeLayer: CAShapeLayer = CAShapeLayer()
func createMask() {
    let bPath = UIBezierPath(roundedRect: plainProgressBar.bounds, byRoundingCorners: [.topRight, .bottomRight], cornerRadii: CGSize(width: 0, height: 0))
    let semiCircle = UIBezierPath(arcCenter: CGPoint(x: bounds.origin.x, y: plainProgressBar.bounds.origin.y+meterCornerRadius), radius: meterCornerRadius, startAngle: 3 * CGFloat.pi / 2, endAngle: CGFloat.pi / 2, clockwise: true)
    shapeLayer.frame = layer.bounds
    bPath.append(semiCircle)
    shapeLayer.path = bPath.cgPath
    shapeLayer.fillRule = kCAFillRuleEvenOdd
    plainProgressBar.layer.mask = shapeLayer
}

最佳答案

绘制一个可拉伸(stretch)的圆圈并更改描绘圆圈的 ImageView 的宽度将为您提供您想要的效果,几乎不费吹灰之力,也没有您遇到的任何瑕疵:

enter image description here

关于ios - 为什么我的 CAShapeLayer 不能正确地使用 UIView (w/gif) 设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47207904/

相关文章:

objective-c - 低 alpha View - 高 alpha subview

ios - UITableView 和 UICollectionView 重新加载不会在主线程上正常工作

swift - 检查数组中的素数

ios - 关闭键盘后如何恢复 UIInputViewController self.view?

ios - 线程 1 : EXC_BAD_INSTRUCTION

ios - Swift 区域监控本地通知触发器

ios 如何删除某个定制的 UIView

ios - Mac OS X 构建服务器 IPA 中缺少 archived-expanded-entitlements.xcent 文件

ios - 更改部分 skspritenode 颜色的最有效方法

iphone - 如何将值添加到属性列表字典内的字典