我一直在尝试更改进度视图的大小和旋转以适应屏幕的大小。它基本上可以在手机屏幕上产生填充玻璃效果。
我通过使用相当无害地旋转它
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。通过将屏幕高度除以这些值,它应该调整为任意大小手机完美。
您可以通过设置其变换来缩放它,如下所示:
斯威夫特2
masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
斯威夫特3、4
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
我在将
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
}
这是最终结果
转型似乎仍然是实现这一目标的唯一方法。 尝试将其添加为 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
}
}
}
如果您使用 Interface Builder 添加了 UIProgressView,只需创建高度约束并更改为您需要的值。就是这样。
这会起作用:
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
对“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
}
在 Swift 3 中,改为 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)
我在 Swift 中遇到同样的情况 - UIProgressView 对角填充
使用
缩放进度条后CGAffineTransformMakeScale(1.0, 5.0)
条形动画从左上角到右下角填充。
将
UIProgressView
放入 UIStackView
中并设置 UIStackView
的约束也可能有效。至少对我有用
我尝试了 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 个常数。但如果您要创建通用应用程序,您也可以使用乘数。
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 用于跟踪和进度。下面的解决方案将圆角半径应用于两个子视图。