2016-05-11 14 views
6

Tôi biết tôi có thể khỏa lấp tất cả bốn góc bằng:Round Top Corners của một UIButton trong Swift

myBtn.layer.cornerRadius = 8 
myBtn.layer.masksToBounds = true 

Kể từ khi tôi chỉ muốn làm tròn hai, tôi đã làm một số nghiên cứu và tìm thấy 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 
    } 
} 

Được gọi là như thế này:

view.roundCorners([.TopLeft , .TopRight], radius: 10) 

Tuy nhiên, điều này không hoạt động cho UIButton. Khi tôi chuyển đổi phần mở rộng được cho loại UIButton và vượt qua nó một nút, đầu ra trông như thế này:

enter image description here

Câu hỏi đặt ra là, làm thế nào để thích ứng này để làm việc trên một UIButton?

+0

Hãy xem xét chấp nhận câu trả lời của tôi, vì đó là câu trả lời chính xác nhất cho vấn đề. Khách truy cập trong tương lai của câu hỏi này sẽ không hài lòng chỉ bằng cách nhìn thấy một loạt các mã hoạt động, nhưng không giải thích tại sao nó hoạt động (đó là những gì mà câu trả lời được chấp nhận hiện hành), nhưng bằng cách nhìn thấy _where_ vấn đề là - và được đóng đinh bởi câu trả lời của tôi. –

+0

xem câu trả lời của tôi ở đây: http://stackoverflow.com/a/40222533/2594699 –

Trả lời

22

Thêm Gia hạn UIButton:

extension UIButton{ 
    func roundedButton(){ 
     let maskPAth1 = UIBezierPath(roundedRect: self.bounds, 
      byRoundingCorners: [.TopLeft , .TopRight], 
      cornerRadii:CGSizeMake(8.0, 8.0)) 
     let maskLayer1 = CAShapeLayer() 
     maskLayer1.frame = self.bounds 
     maskLayer1.path = maskPAth1.CGPath 
     self.layer.mask = maskLayer1 

    } 
} 

Calling trong viewDidAppear/viewDidLayoutSubvies:

btnCorner.roundedButton() 

Nút Corner Output:

enter image description here

+0

Bạn có biết cách tôi có thể xóa nút này khỏi nút sau không? Nếu tôi muốn sử dụng lại nút nhưng không làm tròn? NVM, ở đây là: myBtn.layer.mask? .removeFromSuperlayer() –

0

Sử dụng Bộ luật này,

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

hy vọng nó hữu ích

+0

bro - người hỏi đã được gọi là phương thức như 'view.roundCorners ([. TopLeft, .TopRight], radius: 10)', bạn có thể sửa đổi câu trả lời của bạn khi –

+0

tôi biết người hỏi hỏi nhưng mã ở trên là đúng –

1

Bạn quên để thiết lập khung của lớp hình dạng của bạn:

mask.frame = layer.bounds 
3

Cập nhật bạn mở rộng được như thế này:

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

Hình dạng l ayer (mask) cần phải biết khung

+1

cảm ơn mã, điều này khá hữu ích trong nhiều trường hợp. nhưng hãy thay đổi "maskLayer.frame = rect" thành "mask.frame = rect" – dreampowder

14

Đối nhanh chóng 3 Kirit Modi của câu trả lời được thay đổi thành:

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

Vào lúc bắt đầu của tập tin của tiện ích đừng quên thêm:

import UIKit 

Nếu bạn muốn một phần mở rộng cho UIView với tùy chọn làm tròn các góc trên cùng hoặc dưới cùng bạn có thể sử dụng:

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

Đó là kêu gọi một nút như:

myButton.roundedCorners(top: true) 
1

iOS 11 đã làm cho nó thực sự dễ dàng để làm tròn góc. Mã bên dưới làm tròn các góc trên cùng bên trái và dưới cùng bên phải.

myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner] 
Các vấn đề liên quan