Apakah mungkin untuk mengontrol properti perbatasan UIView (warna, ketebalan, dll ...) langsung dari pembuat antarmuka atau saya hanya dapat melakukannya secara terprogram?
Apakah mungkin untuk mengontrol properti perbatasan UIView (warna, ketebalan, dll ...) langsung dari pembuat antarmuka atau saya hanya dapat melakukannya secara terprogram?
Jawaban:
Sebenarnya Anda dapat mengatur beberapa properti lapisan tampilan melalui pembangun antarmuka. Saya tahu bahwa saya dapat mengatur borderWidth layer dan cornerRadius melalui xcode. borderColor tidak berfungsi, mungkin karena layer menginginkan CGColor bukan UIColor.
Anda mungkin harus menggunakan Strings sebagai ganti angka, tetapi itu berhasil!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Perbarui: layer.masksToBounds = true
Jawaban Rich86Man benar, tetapi Anda dapat menggunakan kategori untuk proksi properti seperti layer.borderColor. (Dari CocoaPod Konvensional )
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
Hasilnya akan jelas selama runtime, bukan di Xcode.
Sunting : Anda juga harus menetapkan layer.borderWidth
setidaknya 1 untuk melihat batas dengan warna yang dipilih.
Dalam Swift 2.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
Di Swift 3.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
Mirip dengan jawaban iHulk, tetapi di Swift
Tambahkan file bernama UIView.swift di proyek Anda (atau cukup tempel ini di file apa pun):
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
}
}
}
Maka ini akan tersedia di Interface Builder untuk setiap tombol, imageView, label, dll. Di Utilities Panel> Attributes Inspector:
Catatan: perbatasan hanya akan muncul saat runtime.
@IBDesignable
dari awal ekstensi.
Anda dapat membuat kategori UIView dan menambahkannya dalam file .h kategori
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Sekarang tambahkan ini dalam file .m
@dynamic borderColor,borderWidth,cornerRadius;
dan ini juga di. file 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];
}
sekarang Anda akan melihat ini di storyboard Anda untuk semua subclass UIView (UILabel, UITextField, UIImageView dll)
Itu .. Tidak Perlu mengimpor kategori di mana saja, cukup tambahkan file kategori dalam proyek dan lihat properti ini di storyboard.
Untuk Swift 3 dan 4 , jika Anda bersedia menggunakan IBInspectable
s, ini dia:
@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
}
}
}
sementara ini mungkin mengatur properti, itu sebenarnya tidak tercermin dalam IB. Jadi jika Anda pada dasarnya menulis kode dalam IB, Anda mungkin juga melakukannya dalam kode sumber Anda
Jika Anda ingin menghemat waktu, cukup gunakan dua UIViews
di atas satu sama lain, satu di belakang menjadi warna perbatasan, dan satu di depan lebih kecil, memberikan efek berbatasan. Saya tidak berpikir ini adalah solusi yang elegan juga, tetapi jika Apple sedikit peduli maka Anda tidak harus melakukan ini.
Ini benar-benar mungkin hanya ketika Anda mengatur layer.masksToBounds = true
dan melakukan hal-hal lainnya.
Storyboard tidak berfungsi untuk saya sepanjang waktu bahkan setelah mencoba semua solusinya di sini
Jadi jawabannya selalu sempurna adalah menggunakan kode, Cukup buat instance IBOutlet dari UIView dan tambahkan properti
Jawaban singkat :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Jawaban panjang :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Silakan tambahkan 2 baris kode sederhana ini:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Ini akan bekerja dengan baik.