Тип выражения Swift 4 '@value CGRect' является неоднозначным без дополнительного контекста - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь реализовать анимацию для прямоугольника, чтобы выполнить модальное вертикальное смахивание. Однако, когда я пытаюсь скомпилировать код, я получаю следующую ошибку «Тип выражения Swift 4« @value CGRect »является неоднозначным без дополнительного контекста». Я изолировал проблему с аргументами, которые передаются значению инициализации CGRect, но в соответствии с документацией 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)
    })
}

Ответы [ 11 ]

0 голосов
/ 13 марта 2019

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

let topRight = CGPoint(x:CGFloat(cellTitleLabel.frame.maxX),y:CGFloat(cellTitleLabel.frame.minY))
0 голосов
/ 04 мая 2019

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

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

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

enter image description here

Решение

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

let height:CGFloat = 100
0 голосов
/ 03 февраля 2019

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

0 голосов
/ 21 февраля 2019

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

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

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

0 голосов
/ 18 декабря 2018

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

let myHeight = CGFloat(100)

myHeight -= myView.frame.height

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

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

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

0 голосов
/ 10 января 2019

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

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

Надеюсь, это поможет! :)

0 голосов
/ 18 декабря 2018

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

enter image description here

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

0 голосов
/ 23 октября 2018

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

0 голосов
/ 24 сентября 2018

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

0 голосов
/ 23 июля 2018

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

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