モーダル垂直スワイプを実行するために長方形のアニメーションを実装しようとしていますが、コードをコンパイルしようとすると、「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)
})
}
View.frame.heightをDoubleで乗算しようとしたときに同じエラーが発生しました。 screenBoundsプロパティで計算を行う場合は、タイプが一致していることを確認してください。
私の問題は、CGFloat変数とDouble変数の間で操作を実行しようとしていたことでした。
修正: Double変数をCGFloatに変換します。変数のタイプを確認してください。
私はそれが役立つことを願っています! :)
「式タイプ '@lvalue CGRect'はあいまいで、これ以上コンテキストがありません」というエラーの原因に対する答えを探してここに来ましたが、ここには何も答えていませんが、問題の解決策を見つけたので、それを残しますGoogle経由でこの質問につまずく他の人のためにここに。 CGRectを作成するときは、コンパイラに依存して正しい型/キャストを推測するのではなく、曖昧な値をCGFloats(例:var width = CGFloat(100))に明示的にキャストしてください。
これは私が報告しようとしているXCode 10.1のバグです。
let myHeight = CGFloat(100)
myHeight -= myView.frame.height
これによりエラーが生成されます。
「式タイプ '@lvalue CGRect'は、コンテキストなしではあいまいです」
エラーは間違っています。問題は、myHeight
が定数であるということです。
「 '@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)
}
問題は、あなたのアニメーション呼び出しです
再フォーマット:
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)
}
)
本当に愚かなn00b答え、私は同じ問題を抱えていました
「式タイプ '@lvalue CGRect'は、コンテキストなしではあいまいです」
原因は、CGFloat
の前にreturnを押したためです。同じ行にあることを確認してください。これが誰かを助けることを願っています。
Rory Priorが上記で書いたように、CGPoint
を作成しようとしてこのエラーが発生し、パラメーターがCGFloat
であることを指定する必要がありましたが、パラメーターx:およびy:にCGPoint
そのためCGPoint
はCGFloat
を期待していることがわかっていました。コードは次のとおりです。
let topRight = CGPoint(x:CGFloat(cellTitleLabel.frame.maxX),y:CGFloat(cellTitleLabel.frame.minY))
CGRect
を作成しようとしてNSLayoutConstraint
の変数名の最後に.constant
を追加するのを忘れたときにこのエラーを受け取りました。