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





Это не ваш 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)
}
Да, я знаю, но компилятор просит вас указать, что это UIView. Не знаю почему :(
У меня это сработало, спасибо! Это не редкость в Xcode, когда он говорит «слишком сложное выражение», и вам нужно разбить его на значимые части.
Проблема заключается в вызове анимации, которая
Переформатировано:
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)
}
)
У меня была такая же ошибка, когда я пытался умножить view.frame.height на Double. Если вы выполняете какие-либо математические операции со свойствами screenBounds, убедитесь, что типы совпадают.
Я пришел сюда в поисках ответа на то, что вызывало ошибку «Тип выражения '@lvalue CGRect' неоднозначен без дополнительного контекста», и хотя здесь ничего не ответило на это за меня, я нашел решение проблемы, поэтому я оставлю его здесь для всех, кто наткнется на этот вопрос через Google. При создании CGRect обязательно явно приводите любые неоднозначные значения к CGFloats (например, var width = CGFloat (100)) вместо того, чтобы полагаться на компилятор, чтобы вывести правильный тип / приведение для вас.
Или вы можете сначала установить локальную переменную, а затем передать ее функции в качестве параметра. Результат - ошибок нет. let viewWidth = view.bounds.width let viewHeight = view.bounds.height scrollView.contentSize = CGSize (ширина: viewWidth, высота: viewHeight)
Только что у меня была такая же проблема. и я исправляю это так:
и, как и в приведенном выше примере,: self.view должен быть назначен другой переменной, а представление должно быть принудительно приведено: view !, и тогда компиляция будет работать успешно.
Привет! Никогда не публикуйте снимок экрана со своим кодом, просто используйте ТЭГИ КОДА, чтобы опубликовать свой код.
Это ошибка в XCode 10.1, о которой я собираюсь сообщить.
let myHeight = CGFloat(100)
myHeight -= myView.frame.height
Это вызывает ошибку:
"Expression type '@lvalue CGRect' is ambiguous without more context"
Ошибка неправильная, проблема в том, что myHeight постоянный.
какой-либо ответ от Apple?
Моя проблема заключалась в том, что я пытался выполнить операцию между переменной CGFloat и переменной Двойной.
Исправить: Преобразует переменную Double в CGFloat. Проверьте свои типы переменных.
Я надеюсь, что это помогает! :)
Это тоже была моя проблема. Что за бесполезное сообщение об ошибке
То же, что и у вас ... Решение просто поместить вашу "неправильную" переменную в CGFloat (ЗДЕСЬ).
Помогает очень !! В моем случае я сравнивал CGFloat и CGPoint.
Я получил эту ошибку, когда попытался создать CGRect и забыл добавить .constant в конец имени переменной для NSLayoutConstraint.
Действительно глупый ответ n00b, у меня была такая же проблема
"Expression type '@lvalue CGRect' is ambiguous without more context"
Причина в том, что я нажимал возвращаться перед CGFloat. Убедитесь, что он находится на той же линии. Надеюсь, это кому-то поможет.
Как и Рори Прайор, я получил эту ошибку, пытаясь создать CGPoint, и мне нужно было указать, что параметры были CGFloat, но мне также нужно было пометить параметры x: и y:, входящие в CGPoint, чтобы CGPoint знал, что ожидал CGFloat. Вот код:
let topRight = CGPoint(x:CGFloat(cellTitleLabel.frame.maxX),y:CGFloat(cellTitleLabel.frame.minY))
Пример
myView.frame = CGRect(x: 0, y: 0, width: CGFloat(videoImaView.frame.width * CGFloat(0.4)), height: height)
Явно объявите копию переменной, которую вы хотите изменить, а затем верните ее.
func clickButton() {
UIView.animateWithDuration(animationDuration, animations: {
let buttonFrame = self.button.frame
buttonFrame.origin.y = buttonFrame.origin.y - 1.0
self.button.frame = buttonFrame
}
}
кредит на ответ Риши здесь: https://stackoverflow.com/a/32133196/11683453
Эта проблема относится к типу данных, я пытался вычесть значение между типами CGFloat и Int, позже я преобразовал оба в один и тот же тип Ex: width: Int ((filterView? .filterTblView.frame.width)!) - Int (ширина!)