ใช้ Storyboard เพื่อปิดบัง UIView และให้มุมโค้งมน?


101

คำถามมากมายเช่นนี้จะอธิบายถึงวิธีการสร้างมาสก์โดยใช้โปรแกรมและให้มุมโค้งมนกับ UIView

มีวิธีดำเนินการทั้งหมดภายใน Storyboard หรือไม่? แค่ถามเพราะดูเหมือนว่าการสร้างมุมโค้งมนใน Storyboard จะช่วยให้การแบ่งเขตระหว่างการนำเสนอและตรรกะชัดเจน


คำตอบ:


268

ใช่ฉันใช้มันมาก แต่คำถามแบบนี้มีคำตอบหลายครั้งแล้ว

แต่อย่างไรก็ตามใน Interface Builder คุณต้องเพิ่ม User Defined Runtime Attributes ดังนี้:

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

ป้อนคำอธิบายภาพที่นี่

และเปิดใช้งาน

Clips subviews

ป้อนคำอธิบายภาพที่นี่

ผล:

ป้อนคำอธิบายภาพที่นี่


ฉันจะเพิ่ม User Defined Runtime Attributes ได้ที่ไหน
Henson Fang

ตามที่แสดงในมุมมองเลือกภาพแรกจากนั้นในบานหน้าต่างด้านขวาเลือกไอคอนที่สาม User Defined Runtime Attributes คลิกรายการด้านล่างเพื่อเพิ่ม Key path ประเภทค่า
วรพจน์โชครัตนสมบัติ

1
คุณสามารถสร้างรัศมีเส้นขอบแบบไดนามิกให้เป็น 50% ของความกว้างเสมอหรือต้องเป็นจำนวนเต็มคง
Crashalot

1
เท่าที่ฉันรู้ค่าคงที่เท่านั้น
วรพจน์โชครัตนสมบัติ

1
แค่ FYI ถ้าอย่างฉันคุณมาที่นี่โดยคิดว่าสิ่งนี้จะใช้ได้กับ LaunchScreen.storyboard ก็ไม่ คุณจะได้รับ: Error: Launch screens may not use user defined runtime attributes. ดูเหมือนว่าถ้าคุณต้องการภาพกลมๆบน LaunchScreen แสดงว่าคุณไม่มีตัวเลือก
Code Knox

22

คุณสามารถทำได้ในสตอรีบอร์ดโดยใช้คุณสมบัติที่ผู้ใช้กำหนดเอง เลือกมุมมองที่คุณต้องการปัดเศษและเปิด Identity Inspector ในส่วนแอททริบิวต์รันไทม์ที่ผู้ใช้กำหนดให้เพิ่มสองรายการต่อไปนี้:

  • Key Path:, layer.cornerRadiusType: Number, Value: (รัศมีใดก็ได้ที่คุณต้องการ)
  • Key Path:, layer.masksToBoundsType: Boolean, Value: checked

คุณอาจต้องนำเข้าQuartzKitไฟล์คลาสที่เกี่ยวข้องในมุมมองของคุณ (ถ้ามี) แต่ฉันขอสาบานว่าฉันได้รับมันให้ทำงานโดยไม่ทำเช่นนั้น ผลลัพธ์ของคุณอาจแตกต่างกันไป

แก้ไข: ตัวอย่างรัศมีแบบไดนามิก

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

}

ฉันตรวจสอบแล้วว่าใช้งานได้ในสนามเด็กเล่น


1
คุณสามารถสร้างรัศมีเส้นขอบแบบไดนามิกให้เป็น 50% ของความกว้างเสมอหรือต้องเป็นจำนวนเต็มคง
Crashalot

5
คุณทำได้ แต่ในรหัสเท่านั้น วิธีแก้ปัญหาที่น่าสนใจคือการเพิ่มคุณสมบัติ IBInspectable ในคลาสมุมมองของคุณซึ่งเป็นค่าตัวเลขระหว่าง 0 ถึง 100 และระบุเปอร์เซ็นต์ของความกว้างที่รัศมีควรจะเป็น ตัวอย่างเช่นค่า 50 หมายความว่ารัศมีควรเป็น 50% ของความกว้าง เนื่องจากเป็นพร็อพเพอร์ตี้ที่คำนวณ (ไม่ได้เก็บไว้) คุณจึงสามารถเพิ่มลงในส่วนขยายของ UIView เพื่อให้มุมมองทั้งหมดมีคุณสมบัติได้
NRitH

@NRitH ฉันสนใจที่จะเห็นอะไรแบบนั้น คุณคิดว่าคุณสามารถโพสต์รหัสที่นี่ได้หรือไม่?
Cobie Fisher

17

เลือกมุมมอง คุณเปลี่ยน Corner Rediuse, Border Widthe และ Border Color โดยใช้ 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
        }
    }
}

3
ทำไมต้องใช้ cornerRadiusV แทน cornerRadius?
luhuiya

1
มันถูกตั้งค่า cornerRadius โดยใช้กระดานเรื่องราวผ่านบันทึกการเขียนโค้ดใน Project
Ananda Aiwale

ทำงานได้อย่างสมบูรณ์แบบ
Hassan Tareq

0

แม้จะเปลี่ยนสตอรี่บอร์ดทั้งหมดแล้วคำตอบของวรพจน์ก็ไม่ได้ผลสำหรับฉัน

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

คำตอบยาว:

มุมโค้งมนของ UIView / UIButton ฯลฯ

customUIView.layer.cornerRadius = 10

ความหนาของขอบ

pcustomUIView.layer.borderWidth = 1

สีเส้นขอบ

customUIView.layer.borderColor = UIColor.blue.cgColor

นี้ไม่ได้พยายามที่จะตอบคำถามและเป็นเพียงสำเนาของคุณคำตอบอื่น ๆ ที่นี่
ชิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.