我试图为矩形实现动画以执行模态垂直滑动。但是,当我尝试编译代码时,出现以下错误“ Swift 4表达式类型'@value CGRect'在没有更多上下文的情况下是模棱两可的”。我已经将问题隔离到传递给CGRect初始值的参数上,但是根据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)
})
}
答案 0 :(得分:26)
当我尝试将view.frame.height乘以Double时,我遇到了相同的错误。如果您要对screenBounds属性进行任何数学运算,请确保类型匹配。
答案 1 :(得分:15)
我的问题是我试图在 CGFloat 变量和 Double 变量之间执行操作。
修复:将Double变量转换为 CGFloat 。检查您的变量类型。
希望对您有所帮助! :)
答案 2 :(得分:13)
我到这里来寻找引起错误的答案“表达类型'@lvalue CGRect'在没有更多上下文的情况下是模棱两可的”,尽管这里没有任何答案可以帮我找到问题的解决方案,所以我请将其留给所有通过Google偶然发现此问题的人。创建CGRect时,请确保将任何含糊的值显式转换为CGFloat(例如var width = CGFloat(100)),而不要依赖编译器为您推断正确的类型/类型。
答案 3 :(得分:5)
这是我将要报告的XCode 10.1中的错误。
let myHeight = CGFloat(100)
myHeight -= myView.frame.height
这会产生错误:
“表达类型'@lvalue CGRect'是模棱两可的,没有更多上下文”
错误是错误的,问题在于myHeight
是一个常数。
答案 4 :(得分:3)
不是您的finalFrameForVC
引发了例外,“'@ value CGRect'在没有更多上下文的情况下是模棱两可的”,而是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)
}
答案 5 :(得分: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)),
。您不能将方法的一部分用括号括起来,包括一个外部参数名称,它必须是:
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)
}
)
答案 6 :(得分:1)
答案 7 :(得分:0)
当我尝试创建CGRect
并忘记在.constant
的变量名末尾添加NSLayoutConstraint
时收到此错误
答案 8 :(得分:0)
就像上面的Rory Prior所写的,我在尝试制作CGPoint
时遇到此错误,我需要指定参数为CGFloat
,但是我还需要标记参数x:和y: CGPoint
,以便CGPoint
知道期望CGFloat
。这是代码:
let topRight = CGPoint(x:CGFloat(cellTitleLabel.frame.maxX),y:CGFloat(cellTitleLabel.frame.minY))
答案 9 :(得分:0)
对我来说,我将Int
用作CGRect 高度。
此错误将Xcode错误地指向y
表达类型'@value CGRect'是模棱两可的,没有更多上下文
只需将高度隐式定义为CGFloat
let height:CGFloat = 100
答案 10 :(得分:0)
示例
myView.frame = CGRect(x: 0, y: 0, width: CGFloat(videoImaView.frame.width * CGFloat(0.4)), height: height)
答案 11 :(得分:0)
明确声明要更改的变量的副本,然后将其分配回。
func clickButton() {
UIView.animateWithDuration(animationDuration, animations: {
let buttonFrame = self.button.frame
buttonFrame.origin.y = buttonFrame.origin.y - 1.0
self.button.frame = buttonFrame
}
}
在此获得Rishi的回答: https://stackoverflow.com/a/32133196/11683453
答案 12 :(得分:-1)
真的很傻n00b回答,我有同样的问题
“表达类型'@lvalue CGRect'是模棱两可的,没有更多上下文”
这是因为我在CGFloat
之前按了 return 。检查以确保它在同一行上。希望这对某人有帮助。