UIView sınır özelliklerini (renk, kalınlık, vb.) Doğrudan arayüz oluşturucudan kontrol etmek mümkün mü yoksa sadece programlı olarak yapabilir miyim?
UIView sınır özelliklerini (renk, kalınlık, vb.) Doğrudan arayüz oluşturucudan kontrol etmek mümkün mü yoksa sadece programlı olarak yapabilir miyim?
Yanıtlar:
Aslında bir görünüm katmanının bazı özelliklerini arayüz oluşturucu ile ayarlayabilirsiniz. Bir katmanın borderWidth ve cornerRadius'u xcode ile ayarlayabileceğimi biliyorum. borderColor çalışmıyor, çünkü katman bir UIColor yerine bir CGColor istiyor.
Sayılar yerine Dizeler kullanmak zorunda kalabilirsiniz, ama işe yarıyor!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Güncelleme: layer.masksToBounds = true
Rich86Man'ın yanıtı doğrudur, ancak layer.borderColor gibi özellikleri proxy yapmak için kategorileri kullanabilirsiniz. ( ConventionalC CocoaPod'dan)
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
Sonuç Xcode'da değil, çalışma sırasında görünür olacaktır.
Düzenleme : Ayrıca layer.borderWidth
seçilen rengin kenarlığını görmek için en az 1 olarak ayarlamanız gerekir .
Swift 2.0'da:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
Swift 3.0'da:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
İHulk'unkine benzer cevap, ancak Swift'te
Projenize UIView.swift adlı bir dosya ekleyin (veya herhangi bir dosyaya yapıştırın):
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
}
}
}
Daha sonra bu, Yardımcı Programlar Paneli> Özellikler Denetçisindeki her düğme, imageView, etiket vb. İçin Arayüz Oluşturucu'da kullanılabilir:
Not: kenarlık yalnızca çalışma zamanında görünür.
@IBDesignable
Uzantının başından kaldırılıncaya kadar Interface Builder'ın bu yaklaşımla çökmesine neden oluyordum .
Bir UIView kategorisi oluşturabilir ve bunu kategorinin .h dosyasına ekleyebilirsiniz
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Şimdi bunu .m dosyasına ekleyin
@dynamic borderColor,borderWidth,cornerRadius;
ve bu da. m dosyası
-(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];
}
şimdi bunu tüm UIView alt sınıfları (UILabel, UITextField, UIImageView vb.) için film şeridinizde göreceksiniz.
Bu kadar .. Hayır Kategoriyi herhangi bir yere aktarmaya gerek yok, sadece kategorinin dosyalarını projeye ekleyin ve bu özellikleri film şeridinde görün.
İçin Swift 3 ve 4 Eğer kullanım çekinmiyorsanız, IBInspectable
s, bu var:
@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
}
}
}
bu özellikleri ayarlayabilse de, aslında IB'ye yansıtmaz. Yani esasen IB'de kod yazıyorsanız, bunu kaynak kodunuzda da yapabilirsiniz.
Zaman kazanmak istiyorsanız UIViews
, birbirinin üstünde iki tane kullanın , arkadaki kenarlık rengi ve öndeki küçük olan kenarlık efektini verir. Bunun da zarif bir çözüm olduğunu düşünmüyorum, ancak Apple biraz daha fazla ilgilenirse bunu yapmak zorunda kalmamalısınız.
Sadece bir layer.masksToBounds = true
şeyleri ayarladığınızda ve dinlediğinizde kesinlikle mümkündür .
Burada tüm çözümü denedikten sonra bile Storyboard benim için her zaman çalışmıyor
Bu yüzden her zaman mükemmel cevap kodu kullanmak, Sadece UIView IBOutlet örneği oluşturmak ve özellikleri eklemek
Kısa cevap :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Uzun cevap :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Lütfen şu 2 basit kod satırını ekleyin:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
İyi çalışacaktır.