Короче говоря:
- Apple НЕ устанавливает
frame
или bounds
для CAShapeLayer
автоматически (а Apple НЕ ИСПОЛЬЗУЕТ эквивалент [UIView sizeThatFits]
)
- Если вы устанавливаете кадр, используя размер ограничивающего прямоугольника пути ... все идет не так. Независимо от того, как вы пытаетесь установить его, он запутывает путь
Итак, как правильно программно установить кадр вновь созданного CAShapeLayer
с добавленным CGPath
? Документы Apple молчат по этому поводу.
Вещи, которые я пробовал, которые не работают:
- Создать
CAShapeLayer
- Создайте
CGPath
, добавьте его в слой
- Проверьте слой
frame
- это {{0,0},{0,0}}
- Набор:
layer.frame = CGPathGetBoundingBox( layer.path )
Кадр теперь правильный, но путь теперь сдвоенный - смещение frame
приводит к эффективному смещению пути на дополнительные (x,y)
пикселей
Набор: layer.bounds = CGPathGetBoundingBox( layer.path )
- ... все сходит с ума. Ничто больше не имеет смысла
- Попробуйте исправить это, выполнив
layer.position = CGPathGetBoundingBox( layer.path ).origin
- ... без кубиков; все еще орехи.
Одна вещь, которую я пробовал, ДЕЙСТВИТЕЛЬНО работает, но вызывает проблемы в других местах:
РЕДАКТИРОВАТЬ: это ломается, как только вы автоматически поворачиваете экран. Мое предположение: для автоповорота Apple требуется контроль над свойством transform.
- Создать
CAShapeLayer
- Создайте
CGPath
, добавьте его в слой
- Проверьте рамку слоя - это
{{0,0},{0,0}}
- Набор:
layer.frame = CGPathGetBoundingBox( layer.path )
- Набор:
layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin
Это работает, но ... многие сторонние коды предполагают, что начальное преобразование для CALayer
- это Identity.
Это не должно быть так сложно! Конечно, я что-то здесь не так делаю?
(у меня было одно предложение: «каждый раз, когда вы добавляете путь, вручную запускайте пользовательскую функцию, чтобы сместить все точки на -1 * (top-left-point.x, top-left-point.y)
». Опять же, это работает - но это до смешного сложно)