swift uiprogressview

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.