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.
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)
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 .
alors que ma dernière attente était quelque chose comme ce qui suit
Je l'ai finalement atteint en suivant deux étapes
1. Définir la contrainte de hauteur depuis Interface Builder:
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
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
}
}
}
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.
Cela fonctionnera:
masteryProgress.transform = CGAffineTransformMakeScale(1, 4)
Dans Swift 3, il est changé en CGAffineTransform (scaleX: CGFloat, y: CGFloat). Le code serait donc:
masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)
Dans Swift version 3.0.2 utilisez ceci:
masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)
Placer le UIProgressView
à l'intérieur d'un UIStackView
et définir les contraintes du UIStackView
pourrait également fonctionner. Au moins travaillé pour moi
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.