在 Swift 中更改 UIProgressView 的高度
Change Height of UIProgressView in Swift
我一直在尝试更改进度视图的大小和旋转以适应屏幕大小。它基本上可以在 phone 的屏幕上产生填充玻璃效果。
我通过使用
self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))
我使用 view.bounds
尝试获取矩形和宽度 x 高度,得到了包围屏幕的视图的大小。所以我没有被困在那里。
我尝试使用 .frame
.drawRect
但是当我使用它们时它要么破坏它们要么什么都不做。
在 interfaceBuilder 中,高度属性似乎被锁定在一个常量值 2。
在构建自定义动画之前有什么解决方案吗?
我试过像其他一些帖子所说的那样在 interfaceBuilder 中设置进度条的高度,但是我需要让进度视图填满整个屏幕,无论它在什么设备上 运行 这样解决方案就不会'在我的情况下不起作用。
我最终使用了
CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))
因为我垂直旋转progressView,所以我将progressView的宽度设置为1334(iPhone 6 Plus的高度)和2的高度。通过划分屏幕的高度通过这些值,它应该完美地调整到任何 phone。
您可以像这样设置它的变换来缩放它:
Swift 2
masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
Swift 3、4
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
这会起作用:
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
转换似乎仍然是实现这一目标的唯一方法。 像这样尝试将其添加为 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
}
}
}
我遇到了与 Swift - UIProgressView fills diagonally
相同的情况
使用
缩放进度条后
CGAffineTransformMakeScale(1.0, 5.0)
条形动画从左上角到右下角填充。
如果您使用 Interface Builder 添加了 UIProgressView,只需创建高度约束并更改为您需要的值。就是这样。
在Swift3中,改为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)
我在将 UIProgressView
设置为圆形矩形时遇到问题。仅使用变换
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
我达到了 这不是我的最终要求。
而我的最终期望是如下所示
经过两步终于搞定了
1.从 Interface Builder 设置高度约束:
2。创建 UIProgressView
的自定义 class 并覆盖 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
放入 UIStackView
并设置 UIStackView
的约束也可能有效。至少对我有用
'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
}
我尝试了 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 个常量。但是,如果您正在创建一个通用应用程序,您也可以使用乘数。
我一直在尝试更改进度视图的大小和旋转以适应屏幕大小。它基本上可以在 phone 的屏幕上产生填充玻璃效果。
我通过使用
self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))
我使用 view.bounds
尝试获取矩形和宽度 x 高度,得到了包围屏幕的视图的大小。所以我没有被困在那里。
我尝试使用 .frame
.drawRect
但是当我使用它们时它要么破坏它们要么什么都不做。
在 interfaceBuilder 中,高度属性似乎被锁定在一个常量值 2。
在构建自定义动画之前有什么解决方案吗?
我试过像其他一些帖子所说的那样在 interfaceBuilder 中设置进度条的高度,但是我需要让进度视图填满整个屏幕,无论它在什么设备上 运行 这样解决方案就不会'在我的情况下不起作用。
我最终使用了
CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))
因为我垂直旋转progressView,所以我将progressView的宽度设置为1334(iPhone 6 Plus的高度)和2的高度。通过划分屏幕的高度通过这些值,它应该完美地调整到任何 phone。
您可以像这样设置它的变换来缩放它:
Swift 2
masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
Swift 3、4
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
这会起作用:
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
转换似乎仍然是实现这一目标的唯一方法。 像这样尝试将其添加为 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
}
}
}
我遇到了与 Swift - UIProgressView fills diagonally
相同的情况使用
缩放进度条后CGAffineTransformMakeScale(1.0, 5.0)
条形动画从左上角到右下角填充。
如果您使用 Interface Builder 添加了 UIProgressView,只需创建高度约束并更改为您需要的值。就是这样。
在Swift3中,改为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)
我在将 UIProgressView
设置为圆形矩形时遇到问题。仅使用变换
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
我达到了 这不是我的最终要求。
而我的最终期望是如下所示
经过两步终于搞定了
1.从 Interface Builder 设置高度约束:
2。创建 UIProgressView
的自定义 class 并覆盖 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
放入 UIStackView
并设置 UIStackView
的约束也可能有效。至少对我有用
'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
}
我尝试了 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 个常量。但是,如果您正在创建一个通用应用程序,您也可以使用乘数。