web-dev-qa-db-fra.com

Swift 4 Le type d'expression '@value CGRect' est ambigu sans autre contexte

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)
    })
}
19
CoderQueue

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.

18
user2428818

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.

9
Rory Prior

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! :)

3
NorthBlast

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)
    }
3
vmeyer

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.

2
Rob Vasvari

Le problème est votre appel d'animation qui

  1. est mal écrit
  2. la méthode n'existe pas

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)
   }
)
2
Sulthan

J'ai eu le même problème tout à l'heure. et je le répare comme ça:

 enter image description here

et comme dans l'exemple ci-dessus, self.view doit être assigné à une autre variable, et la vue doit être forcée: cast!, puis la compilation fonctionnera correctement.

1
Levine Veblen

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

0
Ross Krasner