Изменение высоты UIProgressView в Swift
Я пытаюсь изменить размер и поворот представления прогресса, чтобы принять размер экрана. В основном это будет иметь эффект заполнения стекла на экране телефона.
Я повернул его довольно безобидно, используя self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))
Я получил размер представления, окружающего экран, используя view.bounds
, пытаясь получить прямоугольник и высоту x. Поэтому я не застрял там.
Я пробовал использовать .frame
.drawRect
, но когда я их использую, он либо разбивает их, либо ничего не делает.
Атрибут height, по-видимому, заблокирован с постоянным значением 2 в интерфейсеBuilder.
Какие-либо решения до создания пользовательской анимации?
Я попытался установить высоту индикатора выполнения в интерфейсе, как и некоторые другие сообщения, но мне нужно, чтобы представление прогресса заполняло весь экран независимо от того, какое устройство оно работает, так что решение не будет работать в моем случае.
В итоге я использовал
CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))
Поскольку я вращаю progressView вертикально, я устанавливаю представление прогресса на ширину 1334 (высота iPhone 6 Plus) и высоту 2. Деля высоту экрана по этим значениям она должна изменяться на любой телефон.
Ответы
Ответ 1
Вы можете масштабировать его, задав его преобразование так:
Swift 2
masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
Свифт 3,4
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
![enter image description here]()
Ответ 2
Трансформация по-прежнему является единственным способом достижения этого. Попробуйте добавить его как расширение для 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
}
}
}
Ответ 3
Я столкнулся с проблемой при создании UIProgressView
как круглый прямоугольный. При использовании только преобразования
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Я достиг чего не было моим последним требованием.
![enter image description here]()
в то время как мое последнее ожидание было что-то вроде следующего
![enter image description here]()
Я наконец достиг этого, выполнив два шага
1. Установите ограничение высоты из Interface Builder:
![enter image description here]()
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
}
И вот окончательный результат
![enter image description here]()
Ответ 4
Если вы добавили UIProgressView с помощью Interface Builder, просто создайте ограничение по высоте и измените значение, которое вам нужно. Что это.
Ответ 5
Это будет работать:
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Ответ 6
В Swift 3 он изменился на CGAffineTransform (scaleX: CGFloat, y: CGFloat). Таким образом, код будет выглядеть следующим образом:
masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)
Ответ 7
В Swift версии 3.0.2 используйте это:
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)
Ответ 8
Я испытываю то же самое с Swift - UIProgressView заполняется по диагонали
После того, как шкала прогресса шкалы с помощью
CGAffineTransformMakeScale(1.0, 5.0)
анимация бара становится заполнением от левого верхнего угла к нижнему.
Ответ 9
Помещение UIProgressView
в UIStackView
и установка ограничений UIStackView
могут работать. По крайней мере у меня сработало
Ответ 10
Некоторая модификация ответа "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
}