Как обрезать изображение по верхнему лицевому изображению? - PullRequest
0 голосов
/ 14 октября 2019

Моя цель - экспортировать UIImage из UIView. поэтому я хочу добавить четкую границу над красным кружком, чтобы полученное изображение выглядело как 2-е изображение.

enter image description here Теперь я хочу что-то подобное: я хочу добавить чистый фон поверх красногообведите кружком, чтобы полученное изображение выглядело примерно как(Я знаю, что если я добавлю четкую границу, я не смогу добиться этого, поэтому, пожалуйста, предложите мне добиться этого)

enter image description here

Здесь я только что добавилcolor, эти 2 цвета на самом деле являются изображениями

Редактировать

Я могу сделать это с помощью приведенного ниже кода, но область обрезки не округляется.

func cut(hole: CGRect, inView v: UIView) {
    let p:CGMutablePath = CGMutablePath()
    p.addRect(CGRect.init(x: v.frame.origin.x, y: v.frame.origin.y, width: v.frame.width, height: v.frame.height))
    p.addRect(hole)

    let s = CAShapeLayer()
    s.path = p
    s.fillRule = CAShapeLayerFillRule.evenOdd

    v.layer.mask = s
}

Вот моя демонстрационная ссылка: https://gofile.io/?c=jukO6B

Токовый выход

enter image description here

Любая помощь будет оценена для этого.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Наконец, я получил решение, внеся некоторые изменения в этот ответ в соответствии с требованием: Как я могу "вырезать" прозрачное отверстие в UIImage?

func cut(hole: CGRect, inView v: UIView) {
    let p:CGMutablePath = CGMutablePath()
    v.clipsToBounds = false
    p.addRect(CGRect.init(x: v.frame.origin.x, y: v.frame.origin.y, width: v.frame.width, height: v.frame.height))
    p.addRoundedRect(in: CGRect.init(x: self.vwCarContainer.frame.origin.x, y: self.vwCarContainer.frame.origin.y, width: self.vwCarContainer.frame.width, height: self.vwCarContainer.frame.height), cornerWidth: self.vwCarContainer.layer.cornerRadius, cornerHeight: self.vwCarContainer.layer.cornerRadius)

    let s = CAShapeLayer()
    s.path = p
    s.fillRule = CAShapeLayerFillRule.evenOdd

    v.layer.mask = s
}

Благодарявсе, кто помогает мне достичь этого.

0 голосов
/ 14 октября 2019

Редактировать - Оказалось, что ОП нужен совершенно иной эффект, чем тот, который он нам первоначально показал.

Вот мое предложение ему -

uiview для маскировки клипов с CAShapeLayer и UIBezierPath

Вы должны сделать что-то подобное, создать три вида, изображение одного пользователя, изображение второго значка и третье для прозрачной границы, которая будет маскировать изображение пользователя. И изображение значка, и его граница должны иметь одну и ту же центральную точку.


Вам необходимо изменить layer свойство UIView. Вы должны указать пользовательские свойства слоя представления -

  • Путь к ключу: layer.cornerRadius, Тип: Число, Значение: (какой бы радиус вы ни выбрали)
  • Путь к ключу: layer.masksToBounds, Тип: Boolean, Значение: проверено

Как вы сказали, вы хотите сделать это с раскадровкой, так что вот пример этого -

Check this

Установите фоновый цвет «чистым» для обоих видов, все готово.

PS в примере размеры обоих видов фиксированы,если ваше представление имеет динамический размер (или адаптивный размер), вы должны округлять свои представления по коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...