在Swift中更改UIProgressView的高度

Zac*_*ris 29 uiprogressview swift

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

我用它来无害地旋转它 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.通过将屏幕高度除以这些值,它应调整到任何手机的大小完美.

Ban*_*ngs 86

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

斯威夫特2

masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
Run Code Online (Sandbox Code Playgroud)

斯威夫特3,4

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Sau*_*lui 24

在制作UIProgressView圆形矩形时我遇到了问题.虽然只使用变换

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

而我的最终期望是如下

在此输入图像描述

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

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
    }
Run Code Online (Sandbox Code Playgroud)

这是最终的结果

在此输入图像描述


小智 20

变换似乎仍然是实现这一目标的唯一方法.尝试将其添加为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
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)


Sta*_*ski 12

如果您使用Interface Builder添加了UIProgressView,只需创建高度约束并更改为您需要的值.而已.

  • 哦哇,太对了。我一直在与变换和消失的圆角作斗争,但实际上这很简单;)唯一遗憾的是故事板没有反映现实。 (3认同)

And*_*itz 7

这将有效:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Run Code Online (Sandbox Code Playgroud)


小智 5

'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
}
Run Code Online (Sandbox Code Playgroud)