Nano Hash - криптовалюты, майнинг, программирование

Как обрезать UIView с путем Безье?

Я не совсем уверен, что понимаю, как должен работать UIBezierPath.

Я добавил простой UIView в середине экрана и хотел обрезать его, добавив маску к его слою. Я попробовал это, думая, что получу что-то вроде лозанжи в середине представления:

override func viewDidLoad() {
    super.viewDidLoad()
    viewToClip.backgroundColor = .white
    let bezierPath = UIBezierPath()
    bezierPath.move(to: viewToClip.center)
    bezierPath.addLine(to: CGPoint(x: viewToClip.center.x - 5, y: viewToClip.center.y))
    bezierPath.addLine(to: CGPoint(x: viewToClip.center.x, y: viewToClip.center.y - 5))
    bezierPath.addLine(to: CGPoint(x: viewToClip.center.x + 5, y: viewToClip.center.y))
    bezierPath.addLine(to: CGPoint(x: viewToClip.center.x, y: viewToClip.center.y + 5))
    bezierPath.close()
    let testLayer = CAShapeLayer()
    testLayer.path = bezierPath.cgPath
    viewToClip.layer.mask = testLayer
}

Но вместо этого вид просто исчезает с экрана. Что я делаю не так?

Спасибо за вашу помощь.

19.03.2018

  • Отличается ли backgroundColor view вашего контроллера представления от белого? 19.03.2018
  • @beyowulf Да, я установил другой 19.03.2018

Ответы:


1

Ты можешь попробовать

import UIKit

class bb: UIView {

   var once:Bool = true 

     override func draw(_ rect: CGRect) {

      if(once)
      {
        once = false
        self.backgroundColor = .white
        let bezierPath = UIBezierPath()
        let cen = CGPoint.init(x: self.bounds.size.width/2, y: self.bounds.size.height/2)
        bezierPath.move(to: cen)
        bezierPath.addLine(to: CGPoint(x: cen.x - 5, y: cen.y))
        bezierPath.addLine(to: CGPoint(x: cen.x, y: cen.y - 5))
        bezierPath.addLine(to: CGPoint(x: cen.x + 5, y: cen.y))
        bezierPath.addLine(to: CGPoint(x: cen.x, y: cen.y + 5))
        bezierPath.close()
        let testLayer = CAShapeLayer()
        testLayer.path = bezierPath.cgPath
        testLayer.lineWidth = 1.0

        testLayer.strokeColor = UIColor.blue.cgColor
        testLayer.fillColor = UIColor.green.cgColor
        self.layer.addSublayer(testLayer)
      }        

}
19.03.2018
  • Спасибо, работает (заменил addSublayer(testLayer) на layer.mask = testLayer) и получил желаемый результат 19.03.2018
  • Этот ответ не касается исходного вопроса, который касался маскировки. Кроме того, не рекомендуется настраивать подслои в drawRect, так как переопределение drawRect влияет на производительность и должно использоваться только для рисования непосредственно в графическом контексте представления. Кроме того, drawRect может вызываться несколько раз, что приведет к добавлению ненужных слоев в иерархию слоев представления. Я рад, что этот ответ помог OP, но его следует обновить, чтобы отразить, в чем была проблема и как этот код исправляет проблему. 19.03.2018
  • размещение кода внутри viewDidLoad имеет тот же эффект производительности, что и в drawRect (оба находятся в mainQueue, но выполняются на разных этапах), кроме того, это простой слой, а не сложная задача рисования, которая также будет написана в drawRect, как это делают большинство библиотек с открытым исходным кодом. 19.03.2018
  • Я хочу сказать, что drawRect следует использовать только для рисования непосредственно в графическом контексте вида. Это не то, что делает ваш код. Это настройка и добавление CALayer, которые можно и нужно делать в других местах. Вам не нужно переопределять этот метод, если ваше представление задает свое содержимое другими способами. Например, вам не нужно переопределять этот метод, если… ваше представление задает свое содержимое напрямую, используя объект базового слоя developer.apple.com/documentation/uikit/uiview/1622529-drawrect Если вы хотите настроить слои в начале жизненного цикла UIView, используйте init или awakeFromNib 20.03.2018
  • как насчет сообщества профессиональных разработчиков, которые добавляют метки внутри него не только слой 20.03.2018
  • Они должны использовать init или awakeFromNib, которые гарантированно будут вызываться только один раз в начале жизненного цикла представления. drawRect может вызываться более одного раза. (Этот метод вызывается при первом отображении представления или при возникновении события, которое делает недействительной видимую часть представления.), что может привести к тому, что ненужные представления/слои добавлена ​​иерархия вида/слоя представления. Так же дело не в том, для чего предназначен drawRect, какой код отрисовки. Опять же, drawRect — это не просто UIView эквивалент viewDidLoad, и его не следует рассматривать как таковой. 21.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..