Cambiar la altura de UIProgressView en Swift
(9)
He estado intentando cambiar el tamaño y la rotación de una vista de progreso para adoptar el tamaño de la pantalla. Básicamente funcionaría teniendo un efecto de cristal de relleno en la pantalla del teléfono.
Lo self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))
bastante inofensivamente usando self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))
view.bounds
el tamaño de la vista que encierra la pantalla usando view.bounds
tratando de obtener el rect y el ancho x alto. Así que no estoy atrapado allí.
Intenté usar .frame
.drawRect
pero cuando los uso, los rompe o no hace nada.
El atributo de altura parece estar bloqueado a un valor constante de 2 en interfaceBuilder.
¿Alguna solución antes de construir una animación personalizada?
Intenté establecer la altura de la barra de progreso en interfaceBuilder como dicen otras publicaciones, pero necesito que la vista de progreso ocupe toda la pantalla sin importar en qué dispositivo se esté ejecutando para que la solución no funcione en mi caso.
Terminé usando CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))
Dado que estoy rotando la vista de progreso verticalmente, establezco la vista de progreso en un ancho de 1334 (la altura del iPhone 6 Plus) y una altura de 2. Al dividir la altura de la pantalla por estos valores, debería cambiar el tamaño a cualquier teléfono perfectamente.
En Swift 3, se cambió a CGAffineTransform (scaleX: CGFloat, y: CGFloat). Entonces el código sería:
masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)
En la versión 3.0.2 de Swift usa esto:
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)
Esto funcionará:
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Estoy experimentando lo mismo con Swift: UIProgressView se llena en diagonal
Después de la escala progressbar con
CGAffineTransformMakeScale(1.0, 5.0)
barra de animación se convierte en relleno de la esquina superior izquierda a la derecha inferior.
La transformación todavía parece ser la única manera de lograr esto. Intenta agregarlo como una extensión a UIProgressView como tal.
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
}
}
}
Me enfrenté a un problema al hacer el UIProgressView
como un rect redondo. Mientras se usa solo la transformada
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Logré lo que no era mi último requisito .
mientras que mi expectativa final era algo como lo siguiente
Finalmente lo logré siguiendo dos pasos.
1. Establezca la restricción de altura desde Interface Builder:
2. Cree una clase personalizada de UIProgressView
y anule la func layoutSubviews()
para agregar una capa de máscara personalizada:
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
}
Y aquí está el resultado final.
Poner el UIProgressView
dentro de un UIStackView
y configurar las UIStackView
del UIStackView
podría funcionar también. Al menos trabajaba para mi
Puedes escalarlo configurando su transformación así:
Swift 2
masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)
Swift 3、4
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)
Si agregó UIProgressView utilizando Interface Builder, simplemente cree una restricción de altura y cambie para valorar lo que necesita. Eso es.