web-dev-qa-db-ja.com

Swift 4式タイプ '@value CGRect'は曖昧で、コンテキストがありません

モーダル垂直スワイプを実行するために長方形のアニメーションを実装しようとしていますが、コードをコンパイルしようとすると、「Swift 4 Expression type '@value CGRect' is ambiguous without more context」というエラーが表示されます。 CGRectのinit値に渡される引数に問題を分離しましたが、AppleのiOSドキュメントによれば、これらのパラメーターはアニメーション化する必要がある「フレーム」ビューを指定するのに十分なはずです。

ここに私のコードがあります:

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

View.frame.heightをDoubleで乗算しようとしたときに同じエラーが発生しました。 screenBoundsプロパティで計算を行う場合は、タイプが一致していることを確認してください。

35
user2428818

私の問題は、CGFloat変数とDouble変数の間で操作を実行しようとしていたことでした。

修正: Double変数をCGFloatに変換します。変数のタイプを確認してください。

私はそれが役立つことを願っています! :)

26
valbu17

「式タイプ '@lvalue CGRect'はあいまいで、これ以上コンテキストがありません」というエラーの原因に対する答えを探してここに来ましたが、ここには何も答えていませんが、問題の解決策を見つけたので、それを残しますGoogle経由でこの質問につまずく他の人のためにここに。 CGRectを作成するときは、コンパイラに依存して正しい型/キャストを推測するのではなく、曖昧な値をCGFloats(例:var width = CGFloat(100))に明示的にキャストしてください。

14
Rory Prior

これは私が報告しようとしているXCode 10.1のバグです。

let myHeight = CGFloat(100)

myHeight -= myView.frame.height

これによりエラーが生成されます。

「式タイプ '@lvalue CGRect'は、コンテキストなしではあいまいです」

エラーは間違っています。問題は、myHeightが定数であるということです。

8
Rob Vasvari

「 '@value CGRect'は曖昧であり、コンテキストがない」という例外が発生するのはあなたのfinalFrameForVCではなく、fromView.view.frameです。

fromView.viewをUIViewとして明示的に宣言することで修正します:

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

問題は、あなたのアニメーション呼び出しです

  1. 間違って書かれている
  2. メソッドは存在しません

再フォーマット:

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

(using: transitionContext.finalFrame(for: fromView)),に注意してください。外部パラメーター名の1つを含む括弧でメソッドの一部をラップすることはできません。次のようにする必要があります。

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

それがエラーの原因です。ただし、using:部分を含むアニメーションメソッドもありません。したがって、これは単なるコピーアンドペーストエラーであり、実際には次のようになります。

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

私にとっては、IntをCGRectheightとして設定していました。

Xcodeはこのエラーで誤ってyを指していました

式タイプ '@value CGRect'は、コンテキストなしではあいまいです

enter image description here

解決

暗黙的に高さをCGFloatとして定義するだけです

let height:CGFloat = 100
2
Husam

本当に愚かなn00b答え、私は同じ問題を抱えていました

「式タイプ '@lvalue CGRect'は、コンテキストなしではあいまいです」

原因は、CGFloatの前にreturnを押したためです。同じ行にあることを確認してください。これが誰かを助けることを願っています。

1
user11091582

私は今、同じ問題を抱えていました。そして、私はこのように修正します:

enter image description here

上記の例のように:self.viewを別の変数に割り当てる必要があり、antを強制的にキャストする必要があります:view !、そしてコンパイルは正常に動作します。

1
Levine Veblen

Rory Priorが上記で書いたように、CGPointを作成しようとしてこのエラーが発生し、パラメーターがCGFloatであることを指定する必要がありましたが、パラメーターx:およびy:にCGPointそのためCGPointCGFloatを期待していることがわかっていました。コードは次のとおりです。

let topRight = CGPoint(x:CGFloat(cellTitleLabel.frame.maxX),y:CGFloat(cellTitleLabel.frame.minY))
0
Paul K.

CGRectを作成しようとしてNSLayoutConstraintの変数名の最後に.constantを追加するのを忘れたときにこのエラーを受け取りました。

0
Ross Krasner