Swift 4 Тип выражения '@value CGRect' неоднозначен без дополнительного контекста

Я пытаюсь реализовать анимацию для прямоугольника для выполнения модального вертикального swipe.However, когда я пытаюсь скомпилировать код, я получаю следующую ошибку: "Тип выражения SWIFT 4" @value CGRect "неоднозначен без дополнительного контекста". Я выделил проблему для аргументов, которые передаются в значение CGRect init, но, согласно документации Apple iOS, этих параметров должно быть достаточно, чтобы указать представление "frame", которое мне нужно оживить.

Вот мой код:

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

Ответ 1

У меня была та же ошибка, когда я пытался умножить view.frame.height на Double. Если вы выполняете какие-либо математические операции со свойствами screenBounds, убедитесь, что типы совпадают.

Ответ 2

Моя проблема заключалась в том, что я пытался выполнить операцию между переменной CGFloat и переменной Double.

Исправлено: преобразование переменной Double в CGFloat. Проверьте ваши типы переменных.

Я надеюсь, что это помогает! :)

Ответ 3

Я пришел сюда в поисках ответа на вопрос, что вызывало ошибку "Тип выражения '@lvalue CGRect' неоднозначен без дополнительного контекста”, и хотя здесь ничего не ответило, я нашел решение проблемы, поэтому оставлю его здесь для всех, кто сталкивается с этим вопросом через Google. При создании CGRect обязательно приведите любые неоднозначные значения к CGFloats (например, var width = CGFloat (100)) вместо того, чтобы полагаться на то, что компилятор определит правильный тип/приведение для вас.

Ответ 4

Это ошибка в XCode 10.1, о которой я собираюсь сообщить.

let myHeight = CGFloat(100)

myHeight -= myView.frame.height

Это приводит к ошибке:

"Тип выражения" @lvalue CGRect "неоднозначен без дополнительного контекста"

Ошибка неверна, проблема в том, что myHeight является константой.

Ответ 5

Это не ваш 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)
    }

Ответ 6

Проблема заключается в вашем анимационном вызове, который

  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: part, поэтому я предполагаю, что это просто ошибка копирования-вставки, и вы действительно хотите просто:

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

Ответ 7

У меня была такая же проблема только сейчас. и я исправляю это так:

enter image description here

и как в примере выше, что: self.view должно быть присвоено другой переменной, и представление должно быть принудительно приведено: view !, и тогда компиляция будет работать успешно.

Ответ 8

Я получил эту ошибку, когда попытался создать CGRect и забыл добавить .constant в конец имени переменной для NSLayoutConstraint

Ответ 9

Как Рори Приор писал выше, я получил эту ошибку, пытаясь создать CGPoint и мне нужно было указать, что параметры были CGFloat но мне также нужно было пометить параметры x: и y: при CGPoint в CGPoint чтобы CGPoint знал, что ожидается CGFloat. Вот код:

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

Ответ 10

Для меня я поставил Int в качестве высоты CGRect.

Xcode ошибочно указывал на y с этой ошибкой

Тип выражения '@value CGRect' неоднозначен без дополнительного контекста

enter image description here

Решение

Просто неявно определите высоту как CGFloat

let height:CGFloat = 100

Ответ 11

Действительно глупый ответ n00b, у меня была такая же проблема

"Тип выражения" @lvalue CGRect "неоднозначен без дополнительного контекста"

Это было причиной, потому что я нажал кнопку возврата до CGFloat. Проверьте, чтобы убедиться, что это на одной линии. Надеюсь, это кому-нибудь поможет.