在Swift中更改UIProgressView的高度

时间:2015-07-07 04:53:30

标签: swift uiprogressview

我一直在尝试更改进度视图的大小和旋转以采用屏幕大小。它基本上起到了手机屏幕上的填充玻璃效果的作用。

我通过使用相当无害地旋转它     self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))

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

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

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

在构建自定义动画之前的任何解决方案?

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

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

由于我正在垂直旋转progressView,我将进度视图设置为宽度1334(iPhone 6 Plus的高度)和高度2.通过将屏幕高度除以这些值,它应调整大小完美的电话。

13 个答案:

答案 0 :(得分:78)

您可以通过设置其变换来缩放它:

Swift 2

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

Swift 3,4

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

enter image description here

答案 1 :(得分:18)

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

答案 2 :(得分:15)

在将props作为圆形矩形时,我遇到了问题。虽然只使用转换

UIProgressView

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

enter image description here

虽然我的最终期望如下:

enter image description here

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

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

enter image description here

<强> 2。创建自定义类masteryProgress.transform = CGAffineTransformMakeScale(1, 4) 并覆盖UIProgressView以添加自定义遮罩层:

func layoutSubviews()

这是最终结果

enter image description here

答案 3 :(得分:11)

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

答案 4 :(得分:6)

这将有效:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

在Swift 3.0.2版中使用:

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

答案 7 :(得分:1)

我遇到与Swift - UIProgressView fills diagonally

相同的情况

使用

进行比例进度条后
CGAffineTransformMakeScale(1.0, 5.0)

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

答案 8 :(得分:1)

UIProgressView置于UIStackView内并设置UIStackView的约束也可能有效。至少为我工作

答案 9 :(得分:0)

对“ 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
}

答案 10 :(得分: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

答案 11 :(得分:0)

它对我有用:

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

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

答案 12 :(得分:0)

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