Làm cách nào để tạo một nút tròn đơn giản trong Storyboard?


104

Tôi mới bắt đầu học phát triển iOS, không thể tìm thấy cách làm cho nút tròn đơn giản. Tôi tìm tài nguyên cho các phiên bản cũ. Tôi có cần đặt nền tùy chỉnh cho một nút không? Trong Android, tôi sẽ chỉ sử dụng bản vá 9, nhưng tôi biết iOS không có khả năng này.

nhập mô tả hình ảnh ở đây

Câu trả lời:


82

Để làm điều đó trong bảng phân cảnh, bạn cần sử dụng hình ảnh cho nút.

Ngoài ra, bạn có thể làm điều đó trong mã:

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true

2
tại sao cần clipsToBounds? Có vẻ như, cái bóng đó không hoạt động cho đến khi tôi loại bỏ nó.
Gintas_

1
Câu trả lời tốt, nhưng bạn có thể làm điều đó trong IB, không cần hình ảnh. Xem bên dưới.
zontar

223

Câu trả lời ngắn:

Bạn hoàn toàn có thể tạo một nút tròn đơn giản mà không cần thêm ảnh nền hay viết bất kỳ đoạn mã nào cho giống nhau. Chỉ cần làm theo ảnh chụp màn hình dưới đây, để đặt các thuộc tính thời gian chạy cho nút, để có được kết quả mong muốn.

Nó sẽ không hiển thị trong Storyboardnhưng nó sẽ hoạt động tốt khi bạn chạy dự án.

nhập mô tả hình ảnh ở đây

Lưu ý:
Các 'Đường dẫn chính' layer.cornerRadius và giá trị là 5. Giá trị cần phải được thay đổi theo chiều cao và chiều rộng của nút. Công thức cho nó là chiều cao của nút * 0,50. Vì vậy, hãy chơi xung quanh giá trị để xem nút tròn dự kiến ​​trong trình mô phỏng hoặc trên thiết bị vật lý. Quy trình này sẽ trông tẻ nhạt khi bạn có nhiều nút được làm tròn trong bảng phân cảnh.


9
Vui lòng thêm bình luận khi bỏ phiếu tiêu cực.
Nishant

7
thật đáng thất vọng là IB không thể hiển thị điều này giống như một ứng dụng vẽ nhà máy.
William Cerniuk

2
@WilliamCerniuk: Thực ra thì có thể. Kiểm tra nshipster.com/ibinspectable-ibdesignable
Nishant

Việc đặt các thuộc tính Thời gian chạy do Người dùng Xác định thực sự hoạt động, có thể xem được trong trình mô phỏng sau khi xây dựng.
Nhược điểm Bulaquena

Như câu trả lời được chấp nhận cho biết, bạn cũng có thể cần thêm đường dẫn khóa Boolean clipsToBoundsđể điều này hoạt động.
Tối đa

86

Bạn có thể làm điều gì đó như sau:

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? frame.size.height / 2 : 0
    }
}

Đặt lớp MyButtonvào Identity Inspectorvà trong IB, bạn sẽ có thuộc roundedtính:

nhập mô tả hình ảnh ở đây


4
Cho đến nay câu trả lời tốt nhất. Hôm nay học được điều gì đó mới thật tuyệt vời!
Đánh dấu

2
Câu trả lời này không hoàn chỉnh. Khi bạn khởi chạy ứng dụng của mình, xCode sẽ sử dụng kích thước khung của chế độ xem trong trình tạo giao diện, không phải kích thước khung thực khi ứng dụng đang chạy.
Simon Backx

2
Bạn cũng có thể sử dụng "didSet" thay vì "willSet" và loại bỏ đối số isRounds.
Simon Backx

1
Nếu bạn sử dụng một hình nền, thiết lập layer.masksToBounds = truecũng
zontar

34
  1. Tạo một lớp Cocoa Touch.

nhập mô tả hình ảnh ở đây

  1. Chèn mã vào lớp RoundButton.

    import UIKit
    
    @IBDesignable
    class RoundButton: UIButton {
    
        @IBInspectable var cornerRadius: CGFloat = 0{
            didSet{
            self.layer.cornerRadius = cornerRadius
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0{
            didSet{
                self.layer.borderWidth = borderWidth
            }
        }
    
        @IBInspectable var borderColor: UIColor = UIColor.clear{
            didSet{
                self.layer.borderColor = borderColor.cgColor
            }
        }
    }
  2. Tham khảo hình ảnh.

nhập mô tả hình ảnh ở đây


Vui lòng ngừng đăng liên tục cùng một câu trả lời. Đây được coi là tiếng ồn. Điều chỉnh câu trả lời của bạn cho các câu hỏi khác nhau hoặc, nếu chúng thực sự là cùng một câu hỏi, bạn có thể gắn cờ chúng là trùng lặp (và khi bạn có đủ danh tiếng, hãy bỏ phiếu để đóng).
elixenide

Không biết những người khác có gặp phải trường hợp này không, nhưng ngay sau khi tôi đặt lớp thành một nút và cung cấp cho nó bán kính, chiều rộng đường viền và màu đường viền, Xcode (9.2) đã báo lỗi rằng đã xảy ra lỗi kết xuất. Việc xây dựng ứng dụng thành công nhưng dấu "!" Màu đỏ tiếp tục được hiển thị. Chỉ nói rằng ... Tôi đã chuyển trở lại giải pháp chỉ mã (mặc dù đây thực sự là một cách thanh lịch).
Aeger

10

Tôi tìm thấy cách dễ nhất để làm điều này, là thiết lập angleRadius bằng một nửa chiều cao của chế độ xem.

button.layer.cornerRadius = button.bounds.size.height/2

Không tôi không làm. Nếu chiều cao và chiều rộng của bạn bằng nhau (vì vậy nó sẽ là hình vuông), thì bạn sẽ nhận được một hình tròn. Nhưng nếu chiều rộng lớn hơn chiều cao thì nút sẽ đúng.
FrankkieNL

2
Bạn nói đúng, tôi đã bỏ lỡ những hình ảnh có trong câu hỏi mà chương trình gì các poster đã thực sự sau khi phù hợp với câu trả lời của bạn nhiều hơn câu trả lời được chấp nhận - upvote
Michael Hudson

4

Bạn có thể kết nối IBOutletnút của bạn từ bảng phân cảnh.

Sau đó, bạn có thể thiết lập corner radiusnút của mình để làm cho nó tròn góc.

Ví dụ, bạn outletmyButtonsau đó,

Mục tiêu - C

 self.myButton.layer.cornerRadius = 5.0 ;

Nhanh

  myButton.layer.cornerRadius = 5.0

Nếu bạn muốn nút tròn chính xác thì nút của bạn là widthheightphải equalcornerRadiusphải bằng chiều cao hoặc chiều rộng / 2 (một nửa chiều rộng hoặc chiều cao).


4

Như câu trả lời khác đã đề xuất để thực hiện hầu hết công việc này trong mã, chỉ một câu trả lời thực sự cung cấp một cách để xem các thay đổi của bạn trong Giao diện IB của bảng phân cảnh. Câu trả lời của tôi vượt xa câu trả lời đó bằng cách cho phép bạn thay đổi Bán kính góc của chế độ xem, nút, hình ảnh, v.v.

Vui lòng xem đoạn mã sau. Để sử dụng mã này, hãy tạo một tệp nhanh mới có tên là RoundedView hoặc bất cứ thứ gì bạn muốn gọi nó, sau đó đi tới bảng phân cảnh của bạn và thay đổi lớp thành "RoundedView", "RoundedImageView" hoặc "RoundedButton".

import UIKit

@IBDesignable class RoundedImage: UIImageView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedView: UIView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

1

Trong khi thêm layer.cornerRadiusbảng phân cảnh, hãy đảm bảo rằng bạn không có khoảng trống ở đầu hoặc cuối. Nếu bạn thực hiện sao chép dán, bạn có thể bị chèn khoảng trắng. Sẽ rất tuyệt nếu XCode nói một số loại cảnh báo hoặc lỗi.


0

Thử cái này!!

 override func viewDidLoad() {
   super.viewDidLoad()

   var button = UIButton.buttonWithType(.Custom) as UIButton
   button.frame = CGRectMake(160, 100, 200,40)

   button.layer.cornerRadius =5.0
   button.layer.borderColor = UIColor.redColor().CGColor
   button.layer.borderWidth = 2.0

   button.setImage(UIImage(named:"Placeholder.png"), forState: .Normal)
   button.addTarget(self, action: "OnClickroundButton", forControlEvents: .TouchUpInside)
   button.clipsToBounds = true

   view.addSubview(button)
}
    func OnClickroundButton() {
   NSLog(@"roundButton Method Called");
}

0

Phần mở rộng là lựa chọn tốt nhất cho vấn đề này. Tạo phần mở rộng của Chế độ xem hoặc Nút

public extension UIView {
  //Round the corners
  func roundCorners(){
    let radius = bounds.maxX / 16
    layer.cornerRadius = radius
  }
}

Gọi nó từ mã

button.roundCorners()

0

Tôi đang sử dụng Xcode Phiên bản 11.4

Trong trình kiểm tra thuộc tính, bạn có thể xác định bán kính góc.

Nó sẽ không hiển thị trong Storyboard nhưng nó sẽ hoạt động tốt khi bạn chạy dự án.

nhập mô tả hình ảnh ở đây


-1
import UIKit

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()


    }

    func updateCornerRadius(radius:CGFloat) {
        layer.cornerRadius = radius
    }
    @IBInspectable var cornerRadius:CGFloat = 0{
        didSet{
            updateCornerRadius(radius: cornerRadius)
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.