39 votes

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

Je suis en train de mettre en œuvre une animation pour un rectangle pour effectuer modal de balayage vertical.Cependant, lorsque j'essaie de compiler le code, j'obtiens l'erreur suivante "Swift 4 Expression de type '@valeur CGRect "est ambigu, sans plus de contexte". J'ai isolé le problème de l'argumentation qui est passé à la CGRect initialisation de la valeur, mais selon l'iOS d'Apple documentation de ces paramètres devrait être suffisant pour spécifier le cadre de la vue que j'ai besoin de l'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)
    })
}

43voto

user2428818 Points 435

J'ai eu la même erreur lorsque j'ai essayé de multiplier view.frame.height par un Double. Si vous faites des calculs sur les propriétés screenBounds, assurez-vous que les types correspondent.

39voto

valbu17 Points 3374

Mon problème était que j'essayais d'effectuer une opération entre une variable CGFloat et une variable Double .

Correction: convertissez la variable Double en CGFloat . Vérifiez vos types de variables.

J'espère que ça aide! :)

15voto

Rory Prior Points 392

Je suis arrivé ici à la recherche d'une réponse à la cause de l'erreur "Le type d'expression '@lvalue CGRect' est ambigu sans plus de contexte", et bien que rien ici ne me réponde, j'ai trouvé la solution au problème, donc je vais le laisser ici pour quiconque 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 / distribution correct pour vous.

9voto

Rob Vasvari Points 101

Il s'agit d'un bug 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 plus de contexte"

L'erreur est fausse, le problème est que myHeight est une constante.

4voto

vmeyer Points 1534

Ce n'est pas votre finalFrameForVC qui soulève l'exception "'@value CGRect' est ambigu sans plus de contexte" mais c'est fromView.view.frame .

Corrigez-le en déclarant explicitement fromView.view comme UIView:

 UIView.animate(withDuration: 2, delay: 1, options: [], animations: {
      let view: UIView = fromView.view
      view.frame = finalFrameForVC as! CGRect
    }) { _ in
      transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X