เป็นไปได้หรือไม่ที่จะควบคุมคุณสมบัติเส้นขอบ UIView (สี, ความหนา, ฯลฯ ... ) โดยตรงจากเครื่องมือสร้างอินเตอร์เฟสหรือฉันสามารถทำได้โดยทางโปรแกรมเท่านั้น?
เป็นไปได้หรือไม่ที่จะควบคุมคุณสมบัติเส้นขอบ UIView (สี, ความหนา, ฯลฯ ... ) โดยตรงจากเครื่องมือสร้างอินเตอร์เฟสหรือฉันสามารถทำได้โดยทางโปรแกรมเท่านั้น?
คำตอบ:
ที่จริงแล้วคุณสามารถตั้งค่าคุณสมบัติของเลเยอร์ของมุมมองผ่านตัวสร้างอินเตอร์เฟส ฉันรู้ว่าฉันสามารถตั้งค่า borderWidth และ cornerRadius ของเลเยอร์ผ่าน xcode borderColor ไม่ทำงานอาจเป็นเพราะชั้นต้องการ CGColor แทน UIColor
คุณอาจต้องใช้ Strings แทนตัวเลข แต่ใช้งานได้!
layer.cornerRadius
layer.borderWidth
layer.borderColor
ปรับปรุง: layer.masksToBounds = จริง
คำตอบของ 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!)
}
}
}
คำตอบที่คล้ายกับ 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
}
}
}
จากนั้นจะสามารถใช้งานได้ในตัวสร้างส่วนต่อประสานสำหรับทุกปุ่ม, ภาพ, ฉลาก, ฯลฯ ในแผงยูทิลิตี้> แอททริบิวผู้ตรวจสอบ:
หมายเหตุ: เส้นขอบจะปรากฏที่รันไทม์เท่านั้น
@IBDesignable
จากจุดเริ่มต้นของส่วนขยาย
คุณสามารถสร้างหมวดหมู่ของ 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 ฯลฯ )
ไม่ต้องนำเข้าหมวดหมู่ใด ๆ เพียงแค่เพิ่มไฟล์หมวดหมู่ในโครงการและดูคุณสมบัติเหล่านี้ในกระดานเรื่องราว
สำหรับSwift 3 และ 4หากคุณเต็มใจใช้IBInspectable
s มีสิ่งนี้:
@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
}
}
}
ในขณะที่สิ่งนี้อาจตั้งค่าคุณสมบัติมันไม่ได้สะท้อนให้เห็นใน IB ดังนั้นหากคุณเขียนโค้ดใน IB เป็นหลักคุณก็ควรทำมันในซอร์สโค้ดของคุณ
หากคุณต้องการประหยัดเวลาเพียงใช้สองตัวUIViews
บนกันสีด้านหลังเป็นสีขอบและสีที่เล็กกว่าอยู่ข้างหน้า ฉันไม่คิดว่านี่เป็นคำตอบที่สง่างาม แต่ถ้า Apple ใส่ใจมากกว่านี้คุณก็ไม่ควรทำเช่นนี้
เป็นไปได้อย่างแน่นอนเฉพาะเมื่อคุณตั้งค่าlayer.masksToBounds = true
และคุณจะพักผ่อน
สตอรีบอร์ดไม่ทำงานสำหรับฉันตลอดเวลาแม้หลังจากพยายามแก้ปัญหาทั้งหมดที่นี่
ดังนั้นจึงเป็นคำตอบที่สมบูรณ์แบบเสมอคือการใช้รหัสเพียงแค่สร้างอินสแตนซ์ IBOutlet ของ UIView และเพิ่มคุณสมบัติ
คำตอบสั้น ๆ :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
คำตอบยาว:
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
โปรดเพิ่มรหัสง่ายๆ 2 บรรทัดนี้:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
มันจะทำงานได้ดี