Yanıtlar:
Border özelliğini ayarlamak için görünümün katmanını kullanmanız gerekir. Örneğin:
#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
Bu işlevselliğe erişmek için QuartzCore.framework ile de bağlantı kurmanız gerekir.
__bridge CGColorRef
. Bu çalışmıyor. Cevapta [UIColor blackColor].CGColor
belirtildiği gibi olmalıdır .
#import <QuartzCore/QuartzCore.h>
artık gerekli değil.
Xcode'un en yeni sürümünden bu yana daha iyi bir çözüm var:
İle @IBInspectable
doğrudan 'dan Öznitelikler'i ayarlayabilirsiniz içindeAttributes Inspector
.
Bu User Defined Runtime Attributes
sizin için ayarlar :
Bunu ayarlamak için iki yaklaşım vardır:
Seçenek 1 (Storyboard'da canlı güncelleme ile)
MyCustomView
.UIView
.@IBDesignable
(bu, Görünüm güncellemesini canlı yapar). *@IBInspectable
MyCustomView
'
@IBDesignable
class MyCustomView: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
* @IBDesignable
sadece başlangıçta ayarlandığında çalışırclass MyCustomView
Seçenek 2 (Swift 1.2'den beri çalışmıyor, yorumlara bakın)
UIView Sınıfınızı genişletin:
extension UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
Bu şekilde, varsayılan Görünümünüzde her zaman bu ek düzenlenebilir alanlar bulunur Attributes Inspector
. Diğer bir avantaj da sınıfı MycustomView
her seferinde değiştirmek zorunda kalmamanızdır. Ancak bunun bir dezavantajı, değişikliklerinizi yalnızca uygulamanızı çalıştırdığınızda görmenizdir.
İstediğiniz renge sahip kenarlık da oluşturabilirsiniz ..
view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
* r, g, b, 0 ila 255 arasındaki değerlerdir.
UIView uzantısında aşağıdaki @IBInspectables ekle
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
}
Ve sonra borderColor ve borderWidth niteliklerini doğrudan Nitelik denetçisinden ayarlayabilmelisiniz. Ekteki resme bakın
Vladimir'in CALayer çözümünü kullandığımda ve görünümün üstünde, kalıcı bir UINavigationController'ın işten çıkarılması gibi bir animasyonum var, performans sorunları ile ilgili birçok sorun görüyorum.
Yani, bunu başarmanın başka bir yolu, ancak aksaklıklar ve performans kaybı olmadan, özel bir UIView yapmak ve drawRect
mesajı şöyle uygulamaktır :
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(contextRef, 1);
CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0);
CGContextStrokeRect(contextRef, rect);
}
setNeedsDisplay
ve görünümde çağırırsınız . Bu, UIView'in yeniden çizilmesini zorlar ve dolaylı olarak yeniden arar drawRect
. Test edilmedi, ...
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
Bu kodu deneyin:
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
Performansa neden olduğu için drawRect'i geçersiz kılmayı önermem.
Bunun yerine, sınıfın özelliklerini aşağıdaki gibi değiştiririm (özel uiview'unuzda):
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.borderWidth = 2.f;
self.layer.borderColor = [UIColor redColor].CGColor;
}
return self;
Yukarıdaki yaklaşımı alırken herhangi bir aksaklık görmedim - neden initWithFrame koyarak bu durur ;-)
Bunu @ marczking'in cevabına ( Seçenek 1 ) yorum olarak eklemek istedim , ancak StackOverflow'daki düşük durumum bunu engelliyor.
@ Marczking'in Objective C'ye cevabını verdim. Cazibe gibi çalışıyor, teşekkürler @marczking!
UIView + Border.h:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface UIView (Border)
-(void)setBorderColor:(UIColor *)color;
-(void)setBorderWidth:(CGFloat)width;
-(void)setCornerRadius:(CGFloat)radius;
@end
UIView + Border.m:
#import "UIView+Border.h"
@implementation UIView (Border)
// Note: cannot use synthesize in a Category
-(void)setBorderColor:(UIColor *)color
{
self.layer.borderColor = color.CGColor;
}
-(void)setBorderWidth:(CGFloat)width
{
self.layer.borderWidth = width;
}
-(void)setCornerRadius:(CGFloat)radius
{
self.layer.cornerRadius = radius;
self.layer.masksToBounds = radius > 0;
}
@end
@IBInspectable, iOS 9, Swift 2.0'da benim için çalışıyor
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set(newValue) {
layer.cornerRadius = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
Bir UIView katmanını düzenlemek istemediyseniz, görünümü her zaman başka bir görünüme gömebilirsiniz. Üst görünümün arka plan rengi kenarlık rengine ayarlanmış olacaktır. Sınırın ne kadar geniş olmasını istediğinize bağlı olarak biraz daha büyük olacaktır.
Tabii ki, bu yalnızca görünümünüz şeffaf değilse ve yalnızca tek bir kenarlık rengi istiyorsanız çalışır. OP sınırın kendisinde görünmesini istedi, ancak bu uygulanabilir bir alternatif olabilir.
Farklı kenarlara farklı kenarlık eklemek istiyorsanız, belirli bir stil ile bir alt görünüm eklemek gelmek kolay bir yoldur.