bounds остаётся (0, 0, 100, 100). Геометрически масштабированный прямоугольник занимает (-100, -50, 200, 100), но frame при non-identity transform не является надёжным контрактом.
Какой результат будет выведен? (задача №35)
bounds остаётся (0, 0, 100, 100). Геометрически масштабированный прямоугольник занимает (-100, -50, 200, 100), но frame при non-identity transform не является надёжным контрактом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В Swift создаётся объект UIView с заданным фреймом, после чего к нему применяется аффинное преобразование — масштабирование по оси X в два раза, при этом по оси Y масштаб оставляется без изменений. Необходимо определить, какие координаты и размеры будут напечатаны для свойств bounds и frame после применения трансформации.
import UIKit
let box = UIView(frame: .init(x: -50, y: -50, width: 100, height: 100))
box.transform = .init(scaleX: 2, y: 1)
print(box.bounds) // x: ?, y: ?, width: ?, height: ?
print(box.frame) // x: ?, y: ?, width: ?, height: ?
Ответ
bounds остаётся (0, 0, 100, 100). Геометрически масштабированный прямоугольник занимает (-100, -50, 200, 100), но frame при non-identity transform не является надёжным контрактом.
Исходный центр равен (0, 0), масштабирование вокруг стандартного центра удваивает ширину, сохраняя высоту. В типичном запуске простой scaleX даёт frame с x -100, y -50, шириной 200 и высотой 100. Однако Apple прямо предупреждает не полагаться на frame при transform, отличном от identity. Для расчётов используйте bounds, center и преобразование координат; не обобщайте наблюдаемое значение frame на произвольные повороты или сложные трансформации.
Источник: developer.apple.com.