เป็นไปได้หรือไม่ที่จะตั้งค่าคุณสมบัติเส้นขอบ UIView จากเครื่องมือสร้างอินเตอร์เฟส


184

เป็นไปได้หรือไม่ที่จะควบคุมคุณสมบัติเส้นขอบ UIView (สี, ความหนา, ฯลฯ ... ) โดยตรงจากเครื่องมือสร้างอินเตอร์เฟสหรือฉันสามารถทำได้โดยทางโปรแกรมเท่านั้น?



1
ในกรณีที่ทุกคนมาจาก Google อย่างที่ฉันทำ ในการดูการเปลี่ยนแปลงเหล่านั้นสะท้อนให้เห็นใน IB คุณเพียงแค่ต้องสร้างคลาสย่อยของ UIView และกำหนดให้กับมุมมองใดก็ตามที่คุณต้องการจัดการใน IB
Kanongata

คำตอบ:


392

ที่จริงแล้วคุณสามารถตั้งค่าคุณสมบัติของเลเยอร์ของมุมมองผ่านตัวสร้างอินเตอร์เฟส ฉันรู้ว่าฉันสามารถตั้งค่า borderWidth และ cornerRadius ของเลเยอร์ผ่าน xcode borderColor ไม่ทำงานอาจเป็นเพราะชั้นต้องการ CGColor แทน UIColor

คุณอาจต้องใช้ Strings แทนตัวเลข แต่ใช้งานได้!

layer.cornerRadius
layer.borderWidth
layer.borderColor

ปรับปรุง: layer.masksToBounds = จริง

ตัวอย่าง

อัปเดต: เลือกประเภทที่เหมาะสมสำหรับ Keypath:

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


3
สำหรับคุณและ Peter DeWeese: ฉันใช้ Xcode 4.6.3 และฉันสามารถตั้งค่าประเภทพา ธ เป็น "สี" โดยไม่ต้องใช้อินเทอร์เฟซ CALayer

39
ขออภัย layer.borderColor ไม่สามารถตั้งค่าได้ด้วยวิธีนี้ มันเป็น CGColorRef แต่ประเภทค่าสี IB คือ UIColor
mrgrieves

12
ดังนั้นนี่คือสิ่งที่ผู้ใช้กำหนดคุณลักษณะของรันไทม์! ฮ่าฮ่าเขียนสำหรับ iOS ตั้งแต่ 2011 และฉันไม่เคยเรียนรู้ว่าฟิลด์เหล่านั้นมีไว้เพื่ออะไร ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้
Andy Ibanez

3
ดี แต่คุณต้องตั้งค่าประเภทที่ถูกต้องสำหรับแต่ละคุณสมบัติ ประเภทสำหรับเช่น "layer.cornerRadius" จะต้องตั้งค่าเป็น "Number" แทน "String"!
Peter Kreinz

5
นอกจากนี้อย่าลืมตรวจสอบช่องทำเครื่องหมาย "คลิปถึงขอบเขต" เพื่อให้มุมทำงานรัศมี
Pierre-Olivier Simonard

183

คำตอบของ Rich86Man นั้นถูกต้อง แต่คุณสามารถใช้หมวดหมู่เพื่อคุณสมบัติของพร็อกซีเช่น layer.borderColor (จากCocoaPod ConventionalC )

CALayer + XibConfiguration.h:

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer(XibConfiguration)

// This assigns a CGColor to borderColor.
@property(nonatomic, assign) UIColor* borderUIColor;

@end

CALayer + XibConfiguration.m:

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

-(void)setBorderUIColor:(UIColor*)color
{
    self.borderColor = color.CGColor;
}

-(UIColor*)borderUIColor
{
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

เครื่องมือสร้างส่วนต่อประสาน

layer.borderUIColor

ผลลัพธ์จะปรากฏในระหว่างรันไทม์ไม่ใช่ใน Xcode

แก้ไข : คุณต้องตั้งค่าlayer.borderWidthอย่างน้อย 1 เพื่อดูเส้นขอบด้วยสีที่เลือก

ใน Swift 2.0:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

ใน Swift 3.0:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}

ฉันไม่สามารถทำงานให้ฉันได้ ไฟล์. m ครวญครางเกี่ยวกับ borderColor จะต้องเป็น borderUIColor และเพื่อแก้ไขหลังจากทำแล้วมันยังคงแสดงคำเตือนและสีของเส้นขอบไม่ได้แสดงที่รันไทม์ บิตที่แตกต่างในของฉันคือฉันมี @ Implement NameOfFile ไม่ใช่ @ Implement Calayer (NameOfFile) ฉันไม่เข้าใจส่วนของ CALayer คุณช่วยอธิบายเพิ่มเติมได้ไหม
Dave Haigh

2
@PeterDeWeese คำตอบที่ดี! =)
c-villain

1
คุณสามารถใช้ Number with borderWidth และยอมรับ NSNumber ได้ มันใช้งานได้ดี
Peter DeWeese

1
นี่เป็นทางออกที่ดีที่สุดในความคิดของฉันในการแก้ปัญหาของ BorderColor การใช้หมวดหมู่ที่ยอดเยี่ยม!
EricWasTaken

1
ทำงานใน Swift!
KOTIOS

81

คำตอบที่คล้ายกับ iHulk's one แต่ใน Swift

เพิ่มไฟล์ชื่อ UIView.swift ในโครงการของคุณ (หรือวางลงในไฟล์ใดก็ได้):

import UIKit

@IBDesignable extension UIView {
    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

จากนั้นจะสามารถใช้งานได้ในตัวสร้างส่วนต่อประสานสำหรับทุกปุ่ม, ภาพ, ฉลาก, ฯลฯ ในแผงยูทิลิตี้> แอททริบิวผู้ตรวจสอบ:

คุณสมบัติของผู้ตรวจสอบ

หมายเหตุ: เส้นขอบจะปรากฏที่รันไทม์เท่านั้น


@Gaurav คุณเห็นข้อผิดพลาดอะไร คุณใช้องค์ประกอบใด (UIButton, UILabel ฯลฯ )
Axel Guilmin

ฉันไม่สามารถช่วยคุณได้หากไม่มีรายละเอียดเพิ่มเติม :(
Axel Guilmin

2
ฉันได้รับตัวสร้างส่วนติดต่อล่มด้วยวิธีการนี้จนกว่าฉันจะลบออก@IBDesignableจากจุดเริ่มต้นของส่วนขยาย
Albert Bori

1
มันวิเศษมาก ... ขอบคุณ! ฉันใช้ XCode 8.2.1
bobwki

1
มีประโยชน์และเรียบร้อยมาก! ขอบคุณ!
Karl-John Chow

56

คุณสามารถสร้างหมวดหมู่ของ UIView และเพิ่มลงในไฟล์ประเภท. h

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

ตอนนี้เพิ่มในไฟล์. m

@dynamic borderColor,borderWidth,cornerRadius;

และสิ่งนี้เช่นกันค่ะ ไฟล์ m

-(void)setBorderColor:(UIColor *)borderColor{
    [self.layer setBorderColor:borderColor.CGColor];
}

-(void)setBorderWidth:(CGFloat)borderWidth{
    [self.layer setBorderWidth:borderWidth];
}

-(void)setCornerRadius:(CGFloat)cornerRadius{
    [self.layer setCornerRadius:cornerRadius];
}

ตอนนี้คุณจะเห็นสิ่งนี้ในกระดานเรื่องราวของคุณสำหรับคลาสย่อย UIView ทั้งหมด (UILabel, UITextField, UIImageView ฯลฯ )

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

ไม่ต้องนำเข้าหมวดหมู่ใด ๆ เพียงแค่เพิ่มไฟล์หมวดหมู่ในโครงการและดูคุณสมบัติเหล่านี้ในกระดานเรื่องราว


2
เติมเต็มด้วย IB_DESIGNABLE เพื่อให้ IB วาดมุมมองที่กำหนดเองของคุณใหม่โดยใช้ drawRect: method developer.apple.com/library/ios/recipes/…
txulu

3
ขอบคุณมากถ้าคุณเขียน IB_DESIGNABLE ในไฟล์. h ก่อนหน้าบรรทัดอินเตอร์เฟสคุณไม่จำเป็นต้องเพิ่ม @dynamic line ใน. m
Jasmeet

@ user1618612 ไม่เกี่ยวข้องกับความละเอียดมันเป็นเพียงการตั้งค่าคุณสมบัติเลเยอร์ปกติ
iHulk

11

สำหรับSwift 3 และ 4หากคุณเต็มใจใช้IBInspectables มีสิ่งนี้:

@IBDesignable extension UIView {
    @IBInspectable var borderColor:UIColor? {
        set {
            layer.borderColor = newValue!.cgColor
        }
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            else {
                return nil
            }
        }
    }
    @IBInspectable var borderWidth:CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius:CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

นี่เป็นทางออกที่ดีที่สุดสำหรับฉัน
M --c Đồng

Great Solution, Thank you
Ebtehal___

7

ในขณะที่สิ่งนี้อาจตั้งค่าคุณสมบัติมันไม่ได้สะท้อนให้เห็นใน IB ดังนั้นหากคุณเขียนโค้ดใน IB เป็นหลักคุณก็ควรทำมันในซอร์สโค้ดของคุณ


1
ยินดีต้อนรับสู่ MVC! คุณดูคุณสมบัติไม่ควรอยู่ในรหัส!
Alejandro Iván

2
^ นี่ไม่ใช่สิ่งที่ MVC เป็น
Andrew Plummer

1
พิจารณาว่า 95% ของเวลาที่รหัสนี้ไปในคอนโทรลเลอร์มันก็เป็น MVC แน่นอนว่าคุณควรทำคลาสย่อยหรือขยายมุมมองของคุณอย่างถูกต้องจากนั้นก็ตั้งค่าเพียงแค่การเขียนโค้ด :-)
Daniele Bernardini

4

หากคุณต้องการประหยัดเวลาเพียงใช้สองตัวUIViewsบนกันสีด้านหลังเป็นสีขอบและสีที่เล็กกว่าอยู่ข้างหน้า ฉันไม่คิดว่านี่เป็นคำตอบที่สง่างาม แต่ถ้า Apple ใส่ใจมากกว่านี้คุณก็ไม่ควรทำเช่นนี้


10
วิธีแก้ปัญหาประหยัดเวลาในขณะนี้และเสียเวลามากขึ้นในอนาคต
Lachezar Todorov

0

เป็นไปได้อย่างแน่นอนเฉพาะเมื่อคุณตั้งค่าlayer.masksToBounds = trueและคุณจะพักผ่อน


-1

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

ดังนั้นจึงเป็นคำตอบที่สมบูรณ์แบบเสมอคือการใช้รหัสเพียงแค่สร้างอินสแตนซ์ IBOutlet ของ UIView และเพิ่มคุณสมบัติ

คำตอบสั้น ๆ :

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

คำตอบยาว:

มุมโค้งมนของ UIView / UIButton เป็นต้น

customUIView.layer.cornerRadius = 10

ความหนาชายแดน

pcustomUIView.layer.borderWidth = 2

สีเส้นขอบ

customUIView.layer.borderColor = UIColor.blue.cgColor

คำถามนั้นเจาะจงมากและถามว่าจะทำอย่างไรจากเครื่องมือสร้างอินเตอร์เฟส คำตอบของคุณไม่เกี่ยวข้อง
Shinnyx

-5

โปรดเพิ่มรหัสง่ายๆ 2 บรรทัดนี้:

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

มันจะทำงานได้ดี

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