在 Swift 中更改 UIProgressView 的高度

Change Height of UIProgressView in Swift

我一直在尝试更改进度视图的大小和旋转以适应屏幕大小。它基本上可以在 phone 的屏幕上产生填充玻璃效果。

我通过使用 self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))

我使用 view.bounds 尝试获取矩形和宽度 x 高度,得到了包围屏幕的视图的大小。所以我没有被困在那里。

我尝试使用 .frame .drawRect 但是当我使用它们时它要么破坏它们要么什么都不做。

在 interfaceBuilder 中,高度属性似乎被锁定在一个常量值 2。

在构建自定义动画之前有什么解决方案吗?

我试过像其他一些帖子所说的那样在 interfaceBuilder 中设置进度条的高度,但是我需要让进度视图填满整个屏幕,无论它在什么设备上 运行 这样解决方案就不会'在我的情况下不起作用。

我最终使用了 CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))

因为我垂直旋转progressView,所以我将progressView的宽度设置为1334(iPhone 6 Plus的高度)和2的高度。通过划分屏幕的高度通过这些值,它应该完美地调整到任何 phone。

您可以像这样设置它的变换来缩放它:

Swift 2

masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)

Swift 3、4

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)

这会起作用:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

转换似乎仍然是实现这一目标的唯一方法。 像这样尝试将其添加为 UIProgressView 的扩展。

extension UIProgressView {

    @IBInspectable var barHeight : CGFloat {
        get {
            return transform.d * 2.0
        }
        set {
            // 2.0 Refers to the default height of 2
            let heightScale = newValue / 2.0
            let c = center
            transform = CGAffineTransformMakeScale(1.0, heightScale)
            center = c
        }
    }   
}

我遇到了与 Swift - UIProgressView fills diagonally

相同的情况

使用

缩放进度条后
CGAffineTransformMakeScale(1.0, 5.0)

条形动画从左上角到右下角填充。

如果您使用 Interface Builder 添加了 UIProgressView,只需创建高度约束并更改为您需要的值。就是这样。

在Swift3中,改为CGAffineTransform(scaleX: CGFloat, y: CGFloat)。所以代码将是:

masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)

在 Swift 版本 3.0.2 中使用:

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)

我在将 UIProgressView 设置为圆形矩形时遇到问题。仅使用变换

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

我达到了 这不是我的最终要求

而我的最终期望是如下所示

经过两步终于搞定了

1.从 Interface Builder 设置高度约束:

2。创建 UIProgressView 的自定义 class 并覆盖 func layoutSubviews() 以添加自定义遮罩层:

    override func layoutSubviews() {
        super.layoutSubviews()

        let maskLayerPath = UIBezierPath(roundedRect: bounds, cornerRadius: 4.0)
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = maskLayerPath.cgPath
        layer.mask = maskLayer
    }

这是最终结果

UIProgressView 放入 UIStackView 并设置 UIStackView 的约束也可能有效。至少对我有用

'Sauvik Dolui'答案的一些修改:

在 UIBezierPath 中你应该设置 cornerRadius: like (self.frame.height / 2)。 这是比使用 (4.0) 更通用的解决方案。

override func layoutSubviews() {
    super.layoutSubviews()

    let maskLayerPath = UIBezierPath(roundedRect: bounds, cornerRadius: self.frame.height / 2)
    let maskLayer = CAShapeLayer()
    maskLayer.frame = self.bounds
    maskLayer.path = maskLayerPath.cgPath
    layer.mask = maskLayer
}

我尝试了 Swift 5 的可接受答案,将标签固定到 progressView 的底部,但标签被奇怪地拉伸了。为了在没有任何其他问题的情况下更改高度,我使用 heightAnchor 将其设置为我想要的高度。

1- 创建程序化 UIProgressView:

lazy var progressView: UIProgressView = {
    let progressView = UIProgressView(progressViewStyle: .default)
    progressView.translatesAutoresizingMaskIntoConstraints = false
    progressView.trackTintColor = .white
    progressView.progressTintColor = .green
    progressView.progress = 0
    return progressView
}()

2-设置heightAnchor约束:

progressView.heightAnchor.constraint(equalToConstant: 12).isActive = true 

progressView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
progressView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20).isActive = true
progressView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20).isActive = true

对我有用:

progress.transform = progress.transform.scaledBy(x: 1, y: self.bounds.size.height)

"self.bounds.size.height"就是你要的身高

我给了它高度限制,它对我有用。我给了它 10 个常量。但是,如果您正在创建一个通用应用程序,您也可以使用乘数。