Круглые верхние углы UIButton in Swift
Я знаю, что могу обойти все четыре угла, используя:
myBtn.layer.cornerRadius = 8
myBtn.layer.masksToBounds = true
Поскольку я только хочу обойти два, я провел некоторое исследование и нашел this:
extension UIView {
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
}
}
Что называется так:
view.roundCorners([.TopLeft , .TopRight], radius: 10)
Однако это не работает для UIButton. Когда я включаю расширение для типа UIButton и передаю ему кнопку, результат выглядит следующим образом:
![введите описание изображения здесь]()
Вопрос в том, как мне адаптировать это для работы с UIButton?
Ответы
Ответ 1
Добавление расширения UIButton:
extension UIButton{
func roundedButton(){
let maskPath1 = UIBezierPath(roundedRect: bounds,
byRoundingCorners: [.topLeft , .topRight],
cornerRadii: CGSize(width: 8, height: 8))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = bounds
maskLayer1.path = maskPath1.cgPath
layer.mask = maskLayer1
}
}
Вызов в viewDidAppear/viewDidLayoutSubviews:
btnCorner.roundedButton()
Кнопка Угловой Выход:
![enter image description here]()
Ответ 2
Swift 4: для последних iOS 11 и далее
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 11.0, *) {
self.viewToRound.clipsToBounds = true
viewToRound.layer.cornerRadius = 20
viewToRound.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
} else {
// Fallback on earlier versions
}
}
Раньше iOS (10,9 и т.д.) Версии (работает и для iOS 11)
override func viewDidLayoutSubviews() {
self.viewToRound.clipsToBounds = true
let path = UIBezierPath(roundedRect: viewToRound.bounds,
byRoundingCorners: [.topRight, .topLeft],
cornerRadii: CGSize(width: 20, height: 20))
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
viewToRound.layer.mask = maskLayer
}
Ответ 3
Для быстрого 3 ответ Kirit Modi изменяется на:
extension UIButton {
func roundedButton(){
let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: [.topLeft , .topRight],
cornerRadii:CGSize(width:8.0, height:8.0))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = self.bounds
maskLayer1.path = maskPAth1.cgPath
self.layer.mask = maskLayer1
}
}
В начале файла расширения не забудьте добавить:
import UIKit
Если вы хотите расширение для UIView с возможностью округления верхнего или нижнего угла, вы можете использовать:
extension UIView {
func roundedCorners(top: Bool){
let corners:UIRectCorner = (top ? [.topLeft , .topRight] : [.bottomRight , .bottomLeft])
let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: corners,
cornerRadii:CGSize(width:8.0, height:8.0))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = self.bounds
maskLayer1.path = maskPAth1.cgPath
self.layer.mask = maskLayer1
}
}
Что называется кнопкой:
myButton.roundedCorners(top: true)
Ответ 4
iOS 11 действительно упростил круглые углы. Код ниже округляет верхний левый и нижний правый углы.
myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]
Ответ 5
Обновите расширение таким образом:
extension UIView {
func roundCorners(corners:UIRectCorner, radius: CGFloat) {
let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
let rect = self.bounds
mask.frame = rect
mask.path = path.cgPath
self.layer.mask = mask
}
}
Уровень формы (маска) должен знать фрейм
Ответ 6
Вы забыли установить рамку своего слоя:
mask.frame = layer.bounds
Ответ 7
Используйте этот код,
let path = UIBezierPath(roundedRect:viewTo.bounds, byRoundingCorners:[.TopRight, .TopLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()
maskLayer.path = path.CGPath
viewTo.layer.mask = maskLayer
надеюсь, что это будет полезно
Ответ 8
Для быстрой 5 и максимальной гибкости
Определите расширение с помощью функции roundCorners
extension UIButton {
func roundCorners(corners: UIRectCorner, radius: Int = 8) {
let maskPath1 = UIBezierPath(roundedRect: bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = bounds
maskLayer1.path = maskPath1.cgPath
layer.mask = maskLayer1
}
}
Вызовите функцию roundCorners
myButton.roundCorners(corners: [.topLeft, .topRight])
![enter image description here]()
Или с определенным радиусом
myButton.roundCorners(corners: [.topLeft, .topRight], radius: 20)
![enter image description here]()
Ответ 9
Округление применяется к углу обзора /Button.., но до границы кнопки, оно не применяется правильно. Могу ли я иметь какое-либо решение для этого? @
Вот код, который я использовал, который работает (граница) в iOS11.0 и выше, а не в версиях ниже (<11.0)
if #available(iOS 11.0, *) {
self.layer.cornerRadius = radius
self.layer.maskedCorners = maskedCorners
} else {
let shapeLayer = CAShapeLayer()
shapeLayer.position = self.center
self.layer.masksToBounds = true
self.clipsToBounds = true
let bezirePath = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius))
shapeLayer.bounds = frame
shapeLayer.path = bezirePath.cgPath
self.layer.mask = shapeLayer