Мне нужно закруглить верхние углы вида с любым значением, а также нижние углы того же вида с другим значением. Здесь у меня есть код, который, как я думал, решит эту проблему. Но не работает ... Есть идеи?
bottomPath = UIBezierPath(roundedRect:self.bounds,
byRoundingCorners:[.bottomLeft, .bottomRight],
cornerRadii: CGSize(width: radius, height: radius))
topPath = UIBezierPath(roundedRect:self.bounds,
byRoundingCorners:[.topLeft, .topRight],
cornerRadii: CGSize(width: radius, height: radius))
bottomPath.append(topPath)
maskLayer = CAShapeLayer()
maskLayer?.path = bottomPath.cgPath
self.layer.mask = maskLayer
Если я прокомментирую bottomPath или topPath, я получаю скругленные верхние или нижние углы, но не оба. Спасибо
Добавление двух путей с разными радиусами углов не даст вам желаемого. Смотрите мой ответ. Он включает ссылку на ветку, которая показывает, как создать нужный вам путь.





Позвоните после этого
override func layoutSubviews() {
//here call round func
self.layoutIfNeeded()
super.layoutSubviews()
}
используйте функцию viewDidLayoutSubviews и вызовите свою функцию внутри, чтобы превратить ее в круглый угол.
Пример :
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
headerView.roundedButtonForTopRightTopLeft()
view.setNeedsLayout()
view.setNeedsDisplay()
}
extension UIView {
func roundedButtonForTopRightTopLeft(){
let maskPath1 = UIBezierPath(roundedRect: bounds,
byRoundingCorners: [.topRight , .topLeft],
cornerRadii: CGSize(width: 8, height: 8))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = bounds
maskLayer1.path = maskPath1.cgPath
layer.mask = maskLayer1
}
}
Это закруглит 2 из 4 углов, но не даст эффекта, который будет после OP (все 4 угла закруглены, но с разным радиусом для верхнего и нижнего углов.
Я не верю, что существует какой-либо системный вызов для создания закругленного прямоугольника с разными радиусами углов для каждого угла. Функция UIBezierPath(roundedRect:byRoundingCorners:cornerRadii:), которую вы используете, создаст прямоугольник с закругленными углами, некоторые из которых закруглены, а некоторые нет, но все углы, которые вы просите округлить, будут иметь одинаковый радиус.
Если вы хотите создать путь с разными углами, округленными до разных радиусов, я почти уверен, что вам придется построить такой путь самостоятельно, используя дуги для каждого угла и линейные сегменты для плоских сторон скругленного прямоугольника. (Вы должны нарисовать замкнутый путь, состоящий из дуги с углом / 2, затем отрезка линии и повторить это 4 раза. Центром каждой дуги будет тот угол прямоугольника, вставленный радиусом угла в оба измерения. Это помогает изобразить это на миллиметровой бумаге.)
Немного покопавшись, я нашел этот пост, который включает код для создания закругленного прямоугольника с различным радиусом угла для каждого угла:
IOS: возможно скругление радиуса с разными значениями в каждом углу
У этого ответа есть хорошее расширение
UIBezierPath, которое позволит вам установить разные радиусы для каждого угла ... stackoverflow.com/a/43651478/6257435