J'essaie d'implémenter une animation pour qu'un rectangle effectue un balayage vertical modal. Toutefois, lorsque j'essaie de compiler le code, le message d'erreur suivant s'affiche: "Le type d'expression Swift 4 '@value CGRect' est ambigu sans autre contexte". J'ai isolé le problème des arguments transmis à la valeur d'initialisation CGRect, mais selon la documentation iOS d'Apple, ces paramètres devraient suffire à spécifier la vue "frame" que je dois animer.
Voici mon code:
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard
let fromView = transitionContext.viewController(forKey: .from),
let toView = transitionContext.viewController(forKey: .to)
else {
return
}
let containerView = transitionContext.containerView
containerView.insertSubview((toView.view)!, belowSubview: (fromView.view)!)
let toFrame = transitionContext.finalFrame(for: toView)
let screenBounds = UIScreen.main.bounds
let bottomLeftCorner = CGPoint(x: 0, y: screenBounds.height)
let finalFrameForVC = CGRect(Origin: bottomLeftCorner, size: screenBounds.size)
UIView.animate(withDuration: 2, delay: 1,
options: [], (using: transitionContext.finalFrame(for: fromView)),
animations: {
fromView.view.frame = finalFrameForVC
},
completion: { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
})
}
J'ai eu la même erreur quand j'ai essayé de multiplier view.frame.height par un double. Si vous faites des calculs avec les propriétés de screenBounds, assurez-vous que les types correspondent.
Je suis arrivé ici pour chercher une réponse à la cause de l'erreur "Le type d'expression '@lvalue CGRect' est ambigu sans autre contexte", et bien que rien ici ne réponde à cette question pour moi, j'ai trouvé la solution au problème, donc je le laisse ici pour toute autre personne qui trébuche sur cette question via Google. Lors de la création de votre CGRect, assurez-vous de convertir explicitement toutes les valeurs ambiguës en CGFloats (par exemple, var width = CGFloat (100)) au lieu de compter sur le compilateur pour déduire le type/cast approprié pour vous.
Mon problème était que j'essayais d'effectuer une opération entre une variable CGFloat et une variable Double.
Fix: Convertit la variable Double en CGFloat. Vérifiez vos types de variables.
J'espère que ça aide! :)
Ce n'est pas votre finalFrameForVC
qui génère l'exception "'@value CGRect' est ambigu sans autre contexte" mais c'est fromView.view.frame
.
Corrigez-le en déclarant explicitement fromView.view
comme étant UIView:
UIView.animate(withDuration: 2, delay: 1, options: [], animations: {
let view: UIView = fromView.view
view.frame = finalFrameForVC as! CGRect
}) { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
Ceci est un bogue dans XCode 10.1 que je suis sur le point de signaler.
let myHeight = CGFloat(100)
myHeight -= myView.frame.height
Cela produit l'erreur:
"Le type d'expression '@lvalue CGRect' est ambigu sans autre contexte"
L'erreur est fausse, le problème est que myHeight
est une constante.
Le problème est votre appel d'animation qui
Reformaté:
UIView.animate(
withDuration: 2,
delay: 1,
options: [],
(using: transitionContext.finalFrame(for: fromView)),
animations: {
fromView.view.frame = finalFrameForVC
},
completion: { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
)
Notez le (using: transitionContext.finalFrame(for: fromView)),
. Vous ne pouvez pas mettre une partie de la méthode entre parenthèses, y compris l’un des noms de paramètres externes. Elle devrait être:
UIView.animate(
withDuration: 2,
delay: 1,
options: [],
using: transitionContext.finalFrame(for: fromView),
animations: {
fromView.view.frame = finalFrameForVC
},
completion: { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
)
C'est ce qui cause l'erreur. Cependant, il n'y a pas non plus de méthode d'animation avec la partie using:
, donc je suppose que c'est juste une erreur de copier-coller et que vous voulez juste:
UIView.animate(
withDuration: 2,
delay: 1,
options: [],
animations: {
fromView.view.frame = finalFrameForVC
},
completion: { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
)
J'ai reçu cette erreur lorsque j'ai essayé de créer une CGRect
et que j'ai oublié d'ajouter .constant
à la fin du nom d'une variable pour une NSLayoutConstraint