Nút khung tròn trên iOS 7


76

iOS App Store có nút khung tròn màu xanh lam để mua / tải xuống ứng dụng.

Trong Ứng dụng của tôi, bạn có thể tải xuống nội dung bổ sung và tôi muốn có một nút tương tự, chỉ vì nó trông quen thuộc với người dùng.

Nếu bạn không biết, ý tôi là: các nút này, như "$ 3,99"

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

Sao có thể như thế được?

Câu trả lời:


199

Bạn có thể thao tác CALayer của nút để làm điều này khá dễ dàng.

// assuming you have a UIButton or more generally a UIView called buyButton

buyButton.layer.cornerRadius = 2;
buyButton.layer.borderWidth = 1;
buyButton.layer.borderColor = [UIColor blueColor].CGColor;
// (note - may prefer to use the tintColor of the control)

bạn có thể tinh chỉnh từng cái đó để có được màu sắc và hiệu ứng đường viền mà bạn muốn.

Bạn cũng sẽ phải thêm nhập vào bất kỳ tệp nào bạn muốn sử dụng CALayers

#import <QuartzCore/QuartzCore.h>

Cần lưu ý rằng đây là cách ưa thích của việc tạo ra vòng rect / views giáp, thậm chí rất lâu trước khi iOS 7.
Nicolas Miari

2
Tôi đã tạo một thư viện trông giống hệt như hoạt ảnh khi được nhấn. Hy vọng điều này sẽ hữu ích: github.com/yhpark/YHRoundBorderedButton
yhpark

Xin chào, tôi đang gặp sự cố tốt, tôi chỉ cần làm tròn Top RIght và Botton Góc phải của nút, vậy tôi có thể làm như thế nào? xin đề nghị Cảm ơn trước
Harshit Goel

90

Nếu bạn là người thích sử dụng bảng phân cảnh cho thiết kế giao diện người dùng của mình với iOS .. bạn có thể đặt bán kính góc (và bất kỳ thông số nào khác như đã đề cập trong câu trả lời của dima - mặc dù rất tiếc không phải là màu sắc, vì đó là CGColor và Apple hiện tại không có tùy chọn đó trong cửa sổ bật lên) trong identity inspector-> user defined runtime attributestrong bảng phân cảnh như được hiển thị ở đây:

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

phần thưởng: bạn sử dụng các thuộc tính thời gian chạy cho UIButtonmàu văn bản giữ chỗ (xem tại đây ) và để thay đổi phông chữ của UILabel, UITextFieldUIButtoncũng như (xem tại đây )


3
Ahh! Lưu ý rằng BẠN KHÔNG THỂ ĐẶT MÀU của borderColor, trong trình tạo giao diện. Chỉ có một Loại cho "Màu". Không có một loại cho CGColor - vì vậy rất tiếc là bạn không thể làm như thế này! (Nếu bạn muốn "đen" như CGColor, bạn có thể làm điều đó!)
Fattie

Nó hoạt động đối với bán kính góc nhưng không phải cho borderWidth và borderColor
vijayst

17

Đối với các yếu tố kiểm soát iOS tiêu chuẩn thích UIButton, UILabelthì bạn nên sử dụng UIView tintColorbất động sản:

buyButton.layer.borderColor = buyButton.tintColor.CGColor;

8

Đối với đường viền đơn giản như bạn đã mô tả, hãy sử dụng câu trả lời từ Dima bằng cách sử dụng CALAyer.

Nếu bạn muốn nhiều hơn, ví dụ như một hình chữ nhật tròn với gradient thì hãy sử dụng cách tiếp cận này làm cơ sở:

Tạo một Chế độ xem tùy chỉnh vẽ một hình chữ nhật tròn và đặt nó lên trên nút. Sử dụng chức năng tìm kiếm ở đây để tìm kiếm vẽ hình chữ nhật tròn. Bản vẽ hoạt động bằng cách vẽ 4 cung tròn với bán kính xác định (các góc) và 4 đoạn thẳng.


FTR, đây là cách bạn tạo một UIView với các góc tròn chính xác của iOS7, theo Alex và Brian.

Tôi khá chắc chắn rằng CGPathCreateWithRoundsRect không cung cấp cho bạn các góc tròn "mới". Bạn phải sử dụng bezierPathWithRoundsRect cho các góc "mới".

#import "UIViewWithIOS7RoundedCorners.h"
@implementation UIViewWithIOS7RoundedCorners
-(void)drawRect:(CGRect)rect
    {
    // for a filled shape...

    UIBezierPath* path =
        [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:4];
    [[UIColor blueColor] setFill];
    [path fill];

    // for just a border...

    int thickness=2;
    UIBezierPath* path =
        [UIBezierPath bezierPathWithRoundedRect:
            CGRectInset(self.bounds, thickness/2, thickness/2)
            cornerRadius: 4];
    path.lineWidth = thickness;
    [[UIColor blueColor] setStroke];
    [path stroke];
    }

@end
// ps don't forget to set .backgroundColor=[UIColor clearColor]
// perhaps in initWithCoder/initWithFrame

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

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

Hy vọng nó sẽ giúp ai đó


1
Điều này thực sự không cần thiết. Bạn có thể dễ dàng thêm đường viền / khung hình bằng cách sử dụng CALayer cơ bản của UIButton, hãy xem câu trả lời của tôi để biết hướng dẫn.
Dima

1
à, tôi nhớ rồi, tôi đã sử dụng phương pháp tự vẽ để sử dụng gradient.
AlexWien

2
Cập nhật, để hạn chế câu trả lời này cho các bản vẽ tiên tiến
AlexWien

2
Có một số lợi thế nhỏ cho giải pháp này. +[UIBezierPath bezierPathWithRoundedRect:cornerRadius:]sử dụng kiểu bán kính góc mới. Ngoài ra, bạn có thể tạo một hình ảnh duy nhất để sử dụng cho tất cả các nút, cải thiện hiệu suất hiển thị của GPU.
Brian Nickel

1
giải pháp của tôi dường như đã lỗi thời một chút, bây giờ bạn có UIBezierPath giải quyết điều đó cho bạn. (Nhưng tôi leanerd nhiều tìm kiếm trên src của tay vẽ 4 vòng cung và dây chuyền)
AlexWien


2

Để mở rộng câu trả lời tuyệt vời của @abbood, thực sự có thể đặt màu đường viền và màu nền của lớp của chế độ xem từ IB, nhưng nó yêu cầu một chút công việc chuẩn bị để làm như vậy.

Tôi đã tạo một danh mục tùy chỉnh trên NSView, CALayer + setUIColor.h.

Phương thức đặt màu viền chỉ có một phương thức, setBorderUIColor. Nó lấy một UIColor làm đầu vào, tìm nạp NSColor cơ bản của UIColor và áp dụng màu đó cho lớp của khung nhìn.

Sau đó, trong IB, bạn chỉ cần thêm thuộc tính thời gian chạy do người dùng xác định như sau:

KeyPath layer.borderUIColor Loại màu Giá trị Màu mong muốn.

Trong thời gian chạy, hệ thống gọi phương thức của bạn, truyền vào UIColor được định nghĩa trong IB. Category lấy CGColor từ UIColor và áp dụng nó cho layer.

Bạn có thể thấy điều này trong một dự án đang làm việc trong một dự án github của tôi có tên là

Ngẫu nhiên

Tôi cũng đã làm điều tương tự để thiết lập thuộc tính màu nền của một lớp, nhưng không phải trong dự án trên.


0

Và đối với phiên bản nhanh chóng của Duncan C mở rộng câu trả lời của abbood:

extension CALayer {
    var borderUIColor: UIColor? {
        get {
            if let borderColor = borderColor {
                return UIColor(CGColor: borderColor)
            }
            return nil
        }
        set {
            borderColor = newValue?.CGColor ?? nil
        }
    }
}

0

Với Swift 5.1 / iOS 13, bạn có thể tạo một lớp con của UIButton để có một nút tùy chỉnh trông giống như nút viền tròn màu xanh trong ứng dụng iOS AppStore.

Đoạn mã sau đây cho biết cách quản lý đúng màu sắc (khi nút xuất hiện phía sau chế độ xem mờ của a UIAlertController), màu của tiêu đề, màu nền được đánh dấu, kiểu của đường viền, màu của đường viền và nội dung chèn.

CustomButton.swift:

import UIKit

class CustomButton: UIButton {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setProperties()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setProperties()
    }

    func setProperties() {
        // Set the layer's properties
        layer.borderColor = tintColor?.cgColor
        layer.borderWidth = 1
        layer.cornerRadius = 4

        // Set colors for title's states
        setTitleColor(tintColor, for: .normal)
        setTitleColor(.white, for: .highlighted)

        // Add some margins between the title (content) and the border
        contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
    }

    override var isHighlighted: Bool {
        didSet {
            // Toggle the background color according to button's highlighted state
            backgroundColor = super.isHighlighted ? tintColor : nil
        }
    }

    override func tintColorDidChange() {
        super.tintColorDidChange()

        // When the tint color is changed by the system (e.g. when the button appears below the dimmed view of a UIAlertController), we have to manually update border color and title's text color
        layer.borderColor = tintColor?.cgColor
        setTitleColor(tintColor, for: .normal)
    }

}

ViewController.swift:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .secondarySystemBackground

        let button = CustomButton()
        button.setTitle("Normal", for: .normal)
        button.setTitle("Highlighted", for: .highlighted)
        button.addTarget(self, action: #selector(presentAlert(_:)), for: .touchUpInside)
        view.addSubview(button)

        // auto layout
        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        button.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
    }

    /// Present alert when button is tapped
    @objc func presentAlert(_ sender: UIButton) {
        let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
        let alertAction = UIAlertAction(title: "OK", style: .default)
        alertController.addAction(alertAction)
        present(alertController, animated: true, completion: nil)
    }

}

Các hình ảnh dưới đây cho thấy cách nút tùy chỉnh sẽ xuất hiện ở trạng thái bình thường, khi hệ thống tinColorđược thay đổi (đằng sau chế độ xem mờ của a UIAlertController) và ở highlightedtrạng thái.

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

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.