Неустранимое исключение: CALayerInvalidGeometry CALayer границ содержит NaN: [-14 нан;375 0] - PullRequest
0 голосов
/ 05 июня 2018

Crashlytics, интегрированный с моим приложением, сообщил об ошибке, которая говорит:

CALayerInvalidGeometry: границы CALayer содержат NaN: [-14 нан;375 0]

На самом деле я не могу ни воспроизвести аварию, ни определить какую-либо соответствующую информацию о классе контроллера или методе, где возможно возникновение аварии.Я дважды проверил всю математику, включенную в мое приложение, а также перебрал несколько связанных вопросов по StackOverFlow, но не смог найти никакого решения.Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 05 июня 2018

Их очень трудно обнаружить, но, к сожалению, это похоже на проблему с делением на ноль.Прежде всего, деление на ноль не даст вам NaN, а скорее inf или -inf.Единственный способ получить NaN с делением на ноль - это разделить 0.0 на 0.0.Есть и другие способы получения NaN, например, использование acos(2.0), потому что cos находится на интервале [-1,1].

Но самое приятное то, что любая операция с NaN приводит к NaN, что означает следующее:

let a: CGFloat = 0.0
let b: CGFloat = 0.0
let c: CGFloat = a/b

let frame = CGRect(x: 14.0, y: 30.0*c, width: 375.0, height: 0.0)
print(frame)

вывод (14.0, nan, 375.0, 0.0).Таким образом, даже если вы не видите возможного деления на ноль в 30.0*c, у вас все равно есть деление на ноль в параметре c.

Я знаю, что столкновение с проблемой является очень болезненным.В вашем случае вы могли бы преодолеть его, применив метод верхнего уровня, такой как:

func CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) -> CoreGraphics.CGRect {
    return CoreGraphics.CGRect(x: x.isNaN ? 0.0 : x, y: y.isNaN ? 0.0 : y, width: width.isNaN ? 0.0 : width, height: height.isNaN ? 0.0 : height)
}

Это заменит ваш NaN на 0.0 и, скорее всего, исправит сбой.Тем не менее, нет никакого способа сказать, каковы будут результаты.Вы также можете сделать то же самое и добавить туда несколько операторов if и использовать точку останова, чтобы попытаться случайным образом воспроизвести проблему самостоятельно.Таким образом, вы можете найти больше информации о том, что происходит, но вы должны иметь возможность воспроизвести проблему.

...