2016-03-03 3 views
0

У меня есть UIImageView смещение изображения. Слой этого вида замаскирован CAShapeLayer, чтобы создать круговое «отверстие» на изображении. Чтобы создать отверстие, я использую UIBezierPath с .usesEvenOddFillRule = true.Smootly mooving отверстие в UIImage?

Он работает нормально, когда статический. Но мне нужно, чтобы дыра двигалась пальцем пользователя. Для этого я создаю новый UIBezierPath с четным правилом каждый раз, когда пользователь перемещает свой палец. На небольших телефонах с меньшими изображениями это выглядит нормально, но на iPhone 6 Plus это нестабильно.

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


EDIT:matt's answer будет работать в некоторых случаях, но не в моем случае: я не отображает все изображение только часть его определяется UIBezierPath. Эта часть чаще всего овальная (но может быть прямоугольным или закругленным прямоугольником), и в ней есть «отверстие». Пока отверстие косит пальцами пользователя, отображаемая часть/форма изображения не изменяется - она ​​статична.

ineficient решения, которое было на месте до сих пор в:

  1. Создать UIBezierPath с краем отображаемой части изображения
  2. Set «выравнивается заполнить правило» на нем
  3. Добавить UIBezierPath из отверстие для него
  4. Установить как путь CAShapeLayer с некоторым непрозрачным цветом заливки
  5. Используйте что CAShapeLayer в маске UIImageView

Эта процедура повторялась каждый раз, когда пользователь двигал пальцем. Я не могу просто переместить весь слой маски, так как это также изменит часть отображаемого изображения. Я, что он, чтобы оставаться статичным и двигать только отверстие в нем.

ответ

1

она будет двигаться отверстие бот также скрыть некоторые края изображения

Ну, я не согласен. Перемещение маски точно способ сделать это. Я не понимаю, почему вы думаете, что есть проблема с этим. Возможно, проблема в том, что вы еще не сделали слой маски большой. Он не должен быть того же размера, что и слой, который он маскирует. В этом случае он должен быть примерно в 9 раз больше размера маскируемого слоя (3 горизонтальных и 3 вертикальных), чтобы он продолжал покрывать маскированный слой независимо от того, насколько далеко он перемещается в любом направлении.

+0

См. Мое редактирование. – drasto

+1

Маска изображения, а также маскирует его супер-вид. – matt

+0

Да, это должно сработать! Слишком много работы, мой взгляд на иерархию и множество других факторов, о которых я не упоминал здесь, чтобы это было просто ... Но если я не могу думать ни о каком другом способе, у меня не будет выбора, кроме как сделать эту работу. Спасибо. – drasto