Gunakan Storyboard untuk menutupi UIView dan memberikan sudut membulat?

100

Banyak pertanyaan seperti ini menjelaskan cara membuat mask secara terprogram dan memberikan sudut membulat ke UIView.

Apakah ada cara untuk melakukan semuanya dalam Papan Cerita? Hanya bertanya karena sepertinya membuat sudut membulat di Storyboard membuat demarkasi yang lebih jelas antara presentasi dan logika.

Crashalot
sumber
Kemungkinan duplikat Set a border untuk UIButton di Storyboard
bummi

Jawaban:

264

Ya, saya sering menggunakannya tapi pertanyaan seperti ini sudah dijawab berkali-kali.

Tapi bagaimanapun juga di Interface Builder. Anda perlu menambahkan Atribut Waktu Proses yang Ditentukan Pengguna seperti ini:

layer.masksToBounds Boolean YES
layer.cornerRadius Number {View's Width/2}

masukkan deskripsi gambar di sini

dan aktifkan

Clips subviews

masukkan deskripsi gambar di sini

Hasil:

masukkan deskripsi gambar di sini

Woraphot Chokratanasombat
sumber
di mana saya dapat menambahkan Atribut Waktu Proses yang Ditentukan Pengguna?
Henson Fang
Seperti yang saya tunjukkan di gambar pertama pilih tampilan lalu di panel kanan pilih ikon ketiga Atribut
Waktu Proses yang
1
Dapatkah Anda membuat radius batas dinamis sehingga selalu 50% dari lebarnya atau apakah itu harus berupa bilangan bulat statis?
Crashalot
1
Sejauh yang saya tahu, nilai tetap saja.
Woraphot Chokratanasombat
1
FYI saja, jika seperti saya Anda datang ke sini berpikir ini akan bekerja di LaunchScreen.storyboard, ternyata tidak. Anda akan mendapatkan: Error: Launch screens may not use user defined runtime attributes. Sepertinya jika Anda membutuhkan gambar bulat di LaunchScreen, Anda kehabisan pilihan.
Kode Knox
22

Anda dapat melakukannya di storyboard dengan menggunakan properti yang ditentukan pengguna. Pilih tampilan yang ingin Anda bulatkan dan buka Identity Inspector. Di bagian Atribut Waktu Proses yang Ditentukan Pengguna , tambahkan dua entri berikut:

  • Jalur Kunci:, layer.cornerRadiusJenis: Angka, Nilai: (radius apa pun yang Anda inginkan)
  • Jalur Kunci:, layer.masksToBoundsJenis: Boolean, Nilai: diperiksa

Anda mungkin harus mengimpor QuartzKitfile kelas yang sesuai dengan tampilan Anda (jika ada), tetapi saya bersumpah saya telah membuatnya berfungsi tanpa melakukan itu. Hasil Anda mungkin berbeda.

EDIT: Contoh radius dinamis

extension UIView {

    /// The ratio (from 0.0 to 1.0, inclusive) of the view's corner radius
    /// to its width. For example, a 50% radius would be specified with
    /// `cornerRadiusRatio = 0.5`.
    @IBDesignable public var cornerRadiusRatio: CGFloat {
        get {
            return layer.cornerRadius / frame.width
        }

        set {
            // Make sure that it's between 0.0 and 1.0. If not, restrict it
            // to that range.
            let normalizedRatio = max(0.0, min(1.0, newValue))
            layer.cornerRadius = frame.width * normalizedRatio
        }
    }

}

Saya memverifikasi bahwa ini berfungsi di taman bermain.

NRitH
sumber
1
Dapatkah Anda membuat radius batas dinamis sehingga selalu 50% dari lebarnya atau apakah itu harus berupa bilangan bulat statis?
Crashalot
5
Bisa, tapi hanya dalam kode. Solusi yang menarik, bagaimanapun, adalah dengan menambahkan properti IBInspectable ke kelas tampilan Anda yang merupakan nilai numerik antara 0 dan 100 dan menunjukkan persentase lebar radius yang seharusnya. Misalnya, nilai 50 berarti radius harus 50% dari lebar. Karena ini adalah properti yang dihitung (tidak disimpan), Anda bahkan dapat menambahkannya ke ekstensi UIView sehingga semua tampilan dapat memiliki properti tersebut.
NRitH
@NRitH, saya akan tertarik untuk melihat sesuatu seperti itu. Apakah Anda dapat memposting kode di sini?
Cobie Fisher
17

Pilih tampilan Anda mengubah Corner Rediuse, Border Widthe dan Border Color juga Menggunakan StoryBord

extension UIView {

    @IBInspectable var cornerRadiusV: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidthV: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColorV: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}
Ananda Aiwale
sumber
3
mengapa menggunakan cornerRadiusV daripada cornerRadius?
luhuiya
1
Sudah diatur sudut Radius menggunakan storyboard melalui, simpan tulisan koding di Proyek
Ananda Aiwale
Bekerja dengan sempurna
Hassan Tareq
0

Bahkan setelah membuat semua perubahan di papan cerita, jawaban Woraphot tidak berhasil untuk saya.

Ini berhasil untuk saya:

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

Jawaban panjang :

Sudut Bulat UIView / UIButton dll

customUIView.layer.cornerRadius = 10

Ketebalan Perbatasan

pcustomUIView.layer.borderWidth = 1

Warna Tepi

customUIView.layer.borderColor = UIColor.blue.cgColor
swiftBoy
sumber
Ini tidak mencoba menjawab pertanyaan dan hanya duplikat dari jawaban Anda yang lain di sini .
shim