在 Swift 中更改 UIProgressView 的高度

问题描述 投票:0回答:14

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

我通过使用相当无害地旋转它

self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))

我使用

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

我尝试使用

.frame
.drawRect
但当我使用它们时,它要么破坏它们,要么什么也不做。

在interfaceBuilder中height属性似乎被锁定为常量值2。

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

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

我最终使用了

CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))

由于我垂直旋转进度视图,因此我将进度视图设置为宽度 1334(iPhone 6 Plus 的高度)和高度 2。通过将屏幕高度除以这些值,它应该调整为任意大小手机完美。

swift uiprogressview
14个回答
103
投票

您可以通过设置其变换来缩放它,如下所示:

斯威夫特2

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

斯威夫特3、4

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

enter image description here


55
投票

我在将

UIProgressView
制作为圆形矩形时遇到了问题。仅使用变换时

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

我实现了这不是我的最终要求

虽然我最终的期望是这样的

我通过以下两个步骤终于实现了

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

2。创建

UIProgressView
的自定义类并覆盖
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
    }

这是最终结果


27
投票

转型似乎仍然是实现这一目标的唯一方法。 尝试将其添加为 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
        }
    }   
}

20
投票

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


7
投票

这会起作用:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

6
投票

对“Sauvik Dolui”答案的一些修改:

在UIBezierPath中你应该设置cornerRadius:如(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
}

4
投票

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

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

3
投票

在 Swift 3.0.2 版本中使用这个:

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

1
投票

我在 Swift 中遇到同样的情况 - UIProgressView 对角填充

使用

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

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


1
投票

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


0
投票

我尝试了 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

0
投票

它对我有用:

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

self.bounds.size.height”就是你想要的高度


0
投票

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


0
投票
final class ProgressView: UIProgressView {
    override func layoutSubviews() {
        super.layoutSubviews()
        subviews.enumerated().forEach({ element in
            subviews[element.offset].layer.cornerRadius = frame.height/2
            subviews[element.offset].layer.masksToBounds = true
        })
    }
}

UIProgressView 有 2 个 UIImageView 用于跟踪和进度。下面的解决方案将圆角半径应用于两个子视图。

© www.soinside.com 2019 - 2024. All rights reserved.