Как сделать - Гибридный уголокRadius - Swift 5 - PullRequest
1 голос
/ 08 апреля 2020

Я надеюсь, что все хорошо.

Вот следующее, мне нужно сделать cornerRadius как тот, что в примере, но на иконке он вообще не меняется, а в карусели он делает только нижние углы, а не верхние из них.

Что я могу сделать 1025 * этого? Мои углы не имеют одинаковый радиус со всех сторон.

Пример значков углов

У меня есть функция для углаRadius:

func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
  let path = UIBezierPath(roundedRect: self.bounds,
                          byRoundingCorners: corners,
                          cornerRadii: CGSize(width: radius, height: radius))
  let mask = CAShapeLayer()
  mask.path = path.cgPath
  self.layer.mask = mask
}

В моей иконке я делаю вызов следующим образом:

    bigIconContentView.roundCorners([.topRight, .bottomLeft], radius: 30)
    bigIconContentView.roundCorners([.topLeft], radius: 10)

А в моей карусели я звоню так:

    bStoreImage.roundCorners([.topLeft, .topRight], radius: 20)
    beaconsContentView.roundCorners([.topLeft, .topRight], radius: 20)
    beaconsContentView.roundCorners([.bottomLeft, .bottomRight], radius: 7)

Что я делаю не так? Что я могу сделать, чтобы они работали и создавали эти стороны с разным радиусом?

Я могу сделать два вызова roundCorners для одного и того же элемента, но с разными атрибутами? Как и в моих примерах?

Спасибо за помощь!

1 Ответ

2 голосов
/ 08 апреля 2020

Давайте сосредоточимся на roundCorners(_ corners: radius:)

func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
    let someNewMask = somethingNew(corners, radius: radius)
    self.layer.mask = someNewMask
}

Вы делаете:

bigIconContentView.roundCorners([.topRight, .bottomLeft], radius: 30)
bigIconContentView.roundCorners([.topLeft], radius: 10)

Что в итоге делает это:

let someNewMask1 = somethingNew([.topRight, .bottomLeft], radius: 30)
bigIconContentView.mask = someNewMask1
let someNewMask2 = somethingNew([. topLeft], radius: 10)
bigIconContentView.mask = someNewMask2

Итак вы делаете:

bigIconContentView.mask = someNewMask1
bigIconContentView.mask = someNewMask2

Вы видите проблему? Вы переопределяете bigIconContentView mask новым каждый раз (последний вызывается).

Вы должны применять разные углы все вместе (в радиусе угла нет ничего сложного)

extension UIView {
    func roundCornersRadii(topLeft: CGFloat = 0, topRight: CGFloat = 0, bottomLeft: CGFloat = 0, bottomRight: CGFloat = 0) {
        let path = UIBezierPath()

        path.move(to: CGPoint(x: topLeft, y: 0))
        path.addLine(to: CGPoint(x: bounds.width - topRight, y: 0))
        path.addArc(withCenter: CGPoint(x: bounds.width - topRight, y: topRight),
                    radius: topRight,
                    startAngle: -CGFloat.pi/2.0,
                    endAngle: 0,
                    clockwise: true)
        path.addLine(to: CGPoint(x: bounds.width, y: bounds.width - bottomRight))
        path.addArc(withCenter: CGPoint(x: bounds.width - bottomRight, y: bounds.height - bottomRight),
                    radius: bottomRight,
                    startAngle: 0,
                    endAngle: CGFloat.pi/2.0,
                    clockwise: true)
        path.addLine(to: CGPoint(x: bottomRight, y: bounds.height))
        path.addArc(withCenter: CGPoint(x: bottomLeft, y: bounds.height - bottomLeft),
                    radius: bottomLeft,
                    startAngle: CGFloat.pi/2.0,
                    endAngle: CGFloat.pi,
                    clockwise: true)
        path.addLine(to: CGPoint(x: 0, y: topLeft))
        path.addArc(withCenter: CGPoint(x: topLeft, y: topLeft),
                    radius: topLeft,
                    startAngle: CGFloat.pi,
                    endAngle: CGFloat.pi/2.0,
                    clockwise: true)
        path.close()

        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
} 

Добавление образца теста:

let superView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
let subview = UIView(frame: CGRect(x: 100, y: 100, width: 200, height: 200))
superView.backgroundColor = .red
subview.backgroundColor = .blue
subview.roundCornersRadii(topLeft: 20, topRight: 30, bottomLeft: 40, bottomRight: 50)
superView.addSubview(subview)

enter image description here или в вашем случае:

let superView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
let subview = UIView(frame: CGRect(x: 100, y: 100, width: 200, height: 200))
superView.backgroundColor = .red
subview.backgroundColor = .blue
subview.roundCornersRadii(topLeft: 20, topRight: 30, bottomLeft: 40, bottomRight: 50)
subview.roundCornersRadii(topLeft: 10, topRight: 30, bottomLeft: 30)
superView.addSubview(subview)

enter image description here

...