Что происходит с frame и bounds при применении аффинной трансформации и повороте UIView на 45 градусов
Что проверяют
Понимаете ли вы, что frame это вычисляемое значение, а не хранимое, и что после трансформации им пользоваться нельзя. Вопрос отсеивает тех, кто позиционирует всё кодом через frame и потом ломает анимации.
Как отвечать
boundsэто собственная система координат представления. Размер остаётся исходным, начало обычно нулевое, трансформация его не меняет.centerзадан в координатах суперпредставления и тоже не меняется: поворот идёт вокругlayer.anchorPoint, по умолчанию это центр.frameвозвращается как описывающий прямоугольник повёрнутого представления в координатах родителя. Квадрат 100 на 100 после поворота на 45 градусов даётframeпримерно 141.4 на 141.4, а его начало уезжает в минус, потому что центр остался на месте.
Важнее арифметики другое: при transform, отличном от единичного, значение frame не определено, читать его не следует, а присваивать нельзя. Двигать трансформированное представление нужно через center и bounds.
view.bounds.size // 100 x 100
view.transform = CGAffineTransform(rotationAngle: .pi / 4)
view.bounds.size // по-прежнему 100 x 100
view.frame.size // примерно 141.4 x 141.4Попадание по касанию при этом считается честно: point(inside:) работает в bounds, то есть по настоящему повёрнутому прямоугольнику, а не по описывающему.
Где спотыкаются
Говорят, что frame испортился. Портиться там нечему: он каждый раз вычисляется из center, bounds и transform. Вопрос только в том, что после поворота описывающий прямоугольник перестал совпадать с самим представлением.
Второе: присваивают frame уже повёрнутому представлению. Такое присваивание пересчитает center и bounds обратной трансформацией, размеры уедут, а если код лежит в layoutSubviews, представление будет расти от прохода к проходу.
Третье: смешивают Auto Layout и transform. Ограничения задают нетрансформированные center и bounds, трансформация ложится поверх, и очередной проход разметки вернёт всё на место. Поворот безопаснее анимировать на слое или держать такое представление вне автоматической разметки.