Углы круглой вершины UIButton в Swift

Помните, что лямбда-выражения на самом деле являются только синтаксическим сахаром для анонимных методов.

Говоря, что вы действительно ищете, как анонимные методы используют локальные переменные в родительской области.

Вот ссылка, описывающая это. http://www.codeproject.com/KB/cs/InsideAnonymousMethods.aspx#4

23
задан Community 23 May 2017 в 11:54
поделиться

9 ответов

Добавление расширения 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()

Кнопка Corner OutPut :

enter image description here

44
ответ дан Kirit Modi 23 May 2017 в 11:54
поделиться

В iOS 11 стало действительно легко закруглять углы. Код ниже округляет верхний левый и нижний правый углы.

myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]
6
ответ дан dsunku 23 May 2017 в 11:54
поделиться

Вы забыли установить рамку слоя со своей формой:

mask.frame = layer.bounds
0
ответ дан return true 23 May 2017 в 11:54
поделиться

Используйте этот код,

let path = UIBezierPath(roundedRect:viewTo.bounds, byRoundingCorners:[.TopRight, .TopLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()
maskLayer.path = path.CGPath
viewTo.layer.mask = maskLayer

надеюсь, что это полезно

0
ответ дан Iyyappan Ravi 23 May 2017 в 11:54
поделиться

Для swift 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

0
ответ дан Scott 23 May 2017 в 11:54
поделиться

Обновите расширение так, чтобы оно было таким:

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
}
}

Слой формы (маска) должен знать фрейм

5
ответ дан Edan 23 May 2017 в 11:54
поделиться

Округление применяется к углам обзора / 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
0
ответ дан sharath kumar 23 May 2017 в 11:54
поделиться

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
}
30
ответ дан Naishta 23 May 2017 в 11:54
поделиться

Для swift 3 Ответ Кирита Моди изменен на:

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)
20
ответ дан C. Kontos 23 May 2017 в 11:54
поделиться
Другие вопросы по тегам:

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