我一直在尝试更改进度视图的大小和旋转以采用屏幕大小。它基本上起到了手机屏幕上的填充玻璃效果的作用。
我通过使用相当无害地旋转它
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.通过将屏幕高度除以这些值,它应调整大小完美的电话。
答案 0 :(得分:78)
您可以通过设置其变换来缩放它:
Swift 2
masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
Swift 3,4
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
答案 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
我实现了,这不是我的最终要求。
虽然我的最终期望如下:
我终于通过以下两个步骤实现了它
<强> 1。从Interface Builder设置高度约束:
<强> 2。创建自定义类masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
并覆盖UIProgressView
以添加自定义遮罩层:
func layoutSubviews()
这是最终结果
答案 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 常数。但如果您要创建通用应用,您也可以使用乘数。