Установка правильной рамки вновь созданного CAShapeLayer

Вкратце:

  1. Apple НЕ устанавливает рамку или границы для CAShapeLayer автоматически (и Apple НЕ реализовала эквивалент [UIView sizeThatFits])
  2. Если вы устанавливаете рамку, используя размер ограничивающей области контура... все идет не так. Неважно, как вы пытаетесь его установить, он портит путь

Итак, какой правильный способ программно установить рамку вновь созданного CAShapeLayer с вновь добавленным CGPath? Документация Apple молчит по этому вопросу.

То, что я пробовал, не работает:

  1. Создать CAShapeLayer
  2. Создать CGPath, добавить его в слой
  3. Проверить frame слоя - он {{0,0},{0,0}}
  4. Set: layer.frame = CGPathGetBoundingBox( layer.path )
  5. Рамка теперь правильная, но путь теперь смещен в ДВА раза - изменение рамки приводит к тому, что путь эффективно смещается на дополнительные (x,y) пиксели

  6. Set: layer.bounds = CGPathGetBoundingBox( layer.path )

  7. ... все идет наперекосяк. Ничто больше не имеет смысла
  8. Попробуйте исправить это, сделав layer.position = CGPathGetBoundingBox( layer.path ).origin
  9. ... безрезультатно; все еще бред.

Одна вещь, которую я пробовал, РАБОТАЕТ, но вызывает проблемы в других местах:

EDIT: это ломается, как только вы автоповорачиваете экран. Мое предположение: автоповорот Apple требует контроля свойства "transform".

  1. Создайте CAShapeLayer
  2. Создайте CGPath, добавьте его в слой
  3. Проверьте рамку слоя - она {{0,0},{0,0}}
  4. Установите: layer.frame = CGPathGetBoundingBox( layer.path )
  5. Set: layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // то же самое для y-coord: установите его в "-1 * начало пути

Это работает, но ... многие сторонние программы предполагают, что начальное преобразование для CALayer является Identity.

Это не должно быть так сложно! Наверняка есть что-то, что я делаю неправильно?

(Я получил одно предложение: "каждый раз, когда вы добавляете путь, вручную запускайте пользовательскую функцию для сдвига всех точек на -1 * (top-left-point.x, top-left-point.y)". Опять же, это работает - но это до смешного сложно)

16
задан Regexident 2 September 2013 в 19:57
поделиться