Как создать границу градиента с закругленными углами в UIView в Swift 4

Альтернативное решение, использующее метод .query () :

In [5]: df.query("countries in @countries")
Out[5]:
  countries
1        UK
3     China

In [6]: df.query("countries not in @countries")
Out[6]:
  countries
0        US
2   Germany

0
задан rmaddy 13 July 2018 в 22:23
поделиться

2 ответа

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

Я хочу установить границу слева направо

Вам нужно изменить gradient.startPoint и gradient.endPoint

enum Direction {
    case horizontal
    case vertical
}

class View: UIView {

init(frame: CGRect, cornerRadius: CGFloat, colors: [UIColor], lineWidth: CGFloat = 5, direction: Direction = .horizontal) {
    super.init(frame: frame)

    self.layer.cornerRadius = cornerRadius
    self.layer.masksToBounds = true
    let gradient = CAGradientLayer()
    gradient.frame = CGRect(origin: CGPoint.zero, size: self.frame.size)
    gradient.colors = colors.map({ (color) -> CGColor in
        color.cgColor
    })

    switch direction {
    case .horizontal:
        gradient.startPoint = CGPoint(x: 0, y: 1)
        gradient.endPoint = CGPoint(x: 1, y: 1)
    case .vertical:
        gradient.startPoint = CGPoint(x: 0, y: 0)
        gradient.endPoint = CGPoint(x: 0, y: 1)
    }

    let shape = CAShapeLayer()
    shape.lineWidth = lineWidth
    shape.path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: lineWidth, 
    dy: lineWidth), cornerRadius: cornerRadius).cgPath
    shape.strokeColor = UIColor.black.cgColor
    shape.fillColor = UIColor.clear.cgColor
    gradient.mask = shape

    self.layer.addSublayer(gradient)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Как вы можете видеть, я добавил некоторые дополнительные параметры. Я решил эту проблему, добавив в нее roundedRect:

shape.path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: lineWidth, 
dy: lineWidth), cornerRadius: cornerRadius).cgPath

Как ее использовать:

let myView = View(frame: CGRect(x: 0, y: 0, width: 200, height: 50), cornerRadius: 25, colors: [UIColor.red, .orange, .yellow], lineWidth: 2, direction: .horizontal)
    myView.center = view.center
    view.addSubview(myView)

Снимок экрана:

roundedViewWithGradient

0
ответ дан mrcfal 17 August 2018 в 12:51
поделиться
  • 1
    Спасибо @rmaddy, но как я могу визуализировать градиент слева направо? Я хочу нарисовать градиент слева направо. Как i.stack.imgur.com/V01uy.png – Asif Raza 14 July 2018 в 06:14
  • 2
    Я отредактировал свой ответ, чтобы вы могли выбрать, хотите ли вы вертикальный градиент или горизонтальный. – mrcfal 14 July 2018 в 07:33

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

Измените кадр, который вы передаете в путь безье от self.bounds до self.bounds.insetBy(dx: 5, dy: 5), где 5 - половина вашей ширины линии.

И строки:

gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)

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

Здесь полностью работает код из вашего:

class View: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()

        let path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: 5, dy: 5), byRoundingCorners: [.topLeft, .bottomLeft, .topRight, .bottomRight], cornerRadii: CGSize(width: frame.size.height / 2, height: frame.size.height / 2))

        let gradient = CAGradientLayer()
        gradient.frame =  CGRect(origin: CGPoint.zero, size: frame.size)
        gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
        gradient.colors = [UIColor.green.cgColor, UIColor.red.cgColor]

        let shape = CAShapeLayer()
        shape.lineWidth = 10
        shape.path = path.cgPath
        shape.strokeColor = UIColor.black.cgColor
        shape.fillColor = UIColor.clear.cgColor
        gradient.mask = shape

        layer.insertSublayer(gradient, at: 0)
    }
}
1
ответ дан rmaddy 17 August 2018 в 12:51
поделиться
  • 1
    Спасибо @rmaddy, но как я могу визуализировать градиент слева направо? – Asif Raza 14 July 2018 в 06:13
  • 2
    Код в моем ответе делает градиент слева направо. Когда этот класс будет скопирован, как есть, на детскую площадку Swift, а затем создается экземпляр этого класса View, в результате получится овал с зеленым слева и красный справа. – rmaddy 14 July 2018 в 12:14
Другие вопросы по тегам:

Похожие вопросы: