web-dev-qa-db-fra.com

Modifier la hauteur de UIProgressView dans Swift

J'ai essayé de changer la taille et la rotation d'une vue de progression pour adopter la taille de l'écran. Il fonctionnerait essentiellement avec un effet de verre de remplissage sur l'écran du téléphone.

Je l'ai fait pivoter de façon assez inoffensive en utilisant self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))

J'ai obtenu la taille de la vue enveloppant l'écran en utilisant view.bounds En essayant d'obtenir le rect et la largeur x hauteur. Je ne suis donc pas coincé là-bas.

J'ai essayé d'utiliser .frame.drawRect Mais quand j'utilise ceux-ci, ils les cassent ou ne font rien.

L'attribut height semble être verrouillé à une valeur constante de 2 dans interfaceBuilder.

Avez-vous des solutions avant de créer une animation personnalisée?

J'ai essayé de définir la hauteur de la barre de progression dans interfaceBuilder comme certains autres articles l'ont dit, mais j'ai besoin que la vue de progression remplisse tout l'écran, quel que soit l'appareil sur lequel il fonctionne, afin que la solution ne fonctionne pas dans mon cas.

J'ai fini par utiliser CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))

Étant donné que je fais tourner la progressView verticalement, j'ai défini la vue de progression sur une largeur de 1334 (la hauteur de l'iPhone 6 Plus) et une hauteur de 2. En divisant la hauteur de l'écran par ces valeurs, elle devrait être redimensionnée sur n'importe quel téléphone à la perfection.

25
Zach Morris

Vous pouvez le mettre à l'échelle en définissant sa transformation comme suit:

Swift 2

masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)

Swift 3、4

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)

enter image description here

80
Bannings

J'ai rencontré un problème lors de la création du UIProgressView comme rectangle rond. En utilisant uniquement la transformation

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

J'ai atteint ce qui n'était pas ma dernière exigence .

enter image description here

alors que ma dernière attente était quelque chose comme ce qui suit

enter image description here

Je l'ai finalement atteint en suivant deux étapes

1. Définir la contrainte de hauteur depuis Interface Builder:

enter image description here

2. Créez une classe personnalisée de UIProgressView et remplacez func layoutSubviews() pour ajouter un calque de masque personnalisé:

    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
    }

Et voici le résultat final

enter image description here

18
Sauvik Dolui

Transformer semble toujours être le seul moyen d'y parvenir. Essayez de l'ajouter en tant qu'extension à UIProgressView comme ça.

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
        }
    }   
}
18
THISguy

Si vous avez ajouté UIProgressView à l'aide d'Interface Builder, il vous suffit de créer une contrainte de hauteur et de modifier la valeur dont vous avez besoin. C'est ça.

11

Cela fonctionnera:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
6
Andy Lebowitz

Dans Swift 3, il est changé en CGAffineTransform (scaleX: CGFloat, y: CGFloat). Le code serait donc:

masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)
4
Pandurang Yachwad

Dans Swift version 3.0.2 utilisez ceci:

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)
2
user7510675

Placer le UIProgressView à l'intérieur d'un UIStackView et définir les contraintes du UIStackView pourrait également fonctionner. Au moins travaillé pour moi

1
Anestis S.

Je ressens la même chose avec Swift - UIProgressView se remplit en diagonale

Barre de progression après l'échelle avec

CGAffineTransformMakeScale(1.0, 5.0)

l'animation de la barre se remplit du coin supérieur gauche au coin inférieur droit.

1
Nevermore