Swift 4表达式类型'@value CGRect'不明确,没有更多上下文

时间:2018-07-02 16:22:50

标签: swift cgrect

我试图为矩形实现动画以执行模态垂直滑动。但是,当我尝试编译代码时,出现以下错误“ 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)
    })
}

13 个答案:

答案 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)

问题是您的动画通话

  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)),。您不能将方法的一部分用括号括起来,包括一个外部参数名称,它必须是:

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)

我刚才有同样的问题。我这样修复它:

enter image description here

就像上面的示例一样:self.view必须分配给另一个变量,该视图必须强制转换为view !,然后编译才能成功进行。

答案 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'是模棱两可的,没有更多上下文

enter image description here

解决方案

只需将高度隐式定义为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 。检查以确保它在同一行上。希望这对某人有帮助。