Arabirim oluşturucudan UIView kenarlık özelliklerini ayarlamak mümkün müdür?


184

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?



1
Herkesin benim gibi Google'dan gelmesi durumunda. Bu değişikliklerin IB'ye yansıttığını görmek için sadece bir UIView alt sınıfı oluşturmanız ve bunu IB'de değiştirmek istediğiniz Görünüm'e atamanız gerekir.
Kanongata

Yanıtlar:


392

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

misal

Güncelleme: Tuş Yolu için uygun Türü seçin:

resim açıklamasını buraya girin


3
Siz ve Peter DeWeese: Xcode 4.6.3 kullanıyorum ve CALayer arabirimini uygulamadan tuş yolu türünü "Renk" olarak ayarlayabilirim

39
Ne yazık ki layer.borderColor bu şekilde ayarlanamaz. Bu bir CGColorRef, ancak IB Renk değeri türü bir UIColor.
mrgrieves

12
Bu, kullanıcı tanımlı çalışma zamanı özniteliklerinin yaptığı şeydir! Haha, 2011'den beri iOS için yazıyor ve bu alanların ne için olduğunu hiç öğrenmedim. Bu harika cevap için teşekkürler.
Andy Ibanez

3
Güzel, ama her mülk için doğru türü ayarlamanız gerekiyor. "Layer.cornerRadius" için Tür "String" yerine "Number" olarak ayarlanmalıdır!
Peter Kreinz

5
Ayrıca, cornerRadius'un çalışması için "sınırlara klibi" onay kutusunu işaretlemeyi unutmayın.
Pierre-Olivier Simonard

183

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

Arayüz Oluşturucu

layer.borderUIColor

Sonuç Xcode'da değil, çalışma sırasında görünür olacaktır.

Düzenleme : Ayrıca layer.borderWidthseç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!)
        }
    }
}

Bunun benim için çalışmasını sağlayamıyorum. .M dosyası borderColor'un borderUIColor olması ve düzeltilmesi gerektiği konusunda inliyor, bunu yaptıktan sonra hala uyarılar gösteriyor ve sınır rengi çalışma zamanında görüntülenmiyor. Benimki biraz farklı @ @ NameOfFile, @ application CALayer (NameOfFile) var, ben CALayer bölümünü anlamıyorum, daha fazla açıklayabilir misiniz lütfen
Dave Haigh

2
@PeterDeWeese büyük cevap! =)
c-villain

1
Aslında Number'ı borderWidth ile kullanabilir ve bir NSNumber kabul edebilirsiniz. İyi çalışıyor.
Peter DeWeese

1
Bu kesinlikle bence BorderColor sorununu çözmek için en iyi çözüm. Kategorilerin harika kullanımı!
EricWasTaken

1
Swift'te çalıştı!
KOTIOS

81

İ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:

Öznitelik Müfettişi

Not: kenarlık yalnızca çalışma zamanında görünür.


@Gaurav Hangi hatayı görüyorsunuz? Hangi bileşeni (UIButton, UILabel vb.) Kullanıyorsunuz?
Axel Guilmin

Daha fazla detay olmadan size yardım edemem :(
Axel Guilmin

2
@IBDesignableUzantının başından kaldırılıncaya kadar Interface Builder'ın bu yaklaşımla çökmesine neden oluyordum .
Albert Bori

1
Bu inanılmaz ... Teşekkürler! XCode 8.2.1 kullanıyorum
bobwki

1
Çok kullanışlı ve temiz! Teşekkürler!
Karl-John Chow

56

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.

resim açıklamasını buraya girin

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.


2
DrawRect'i kullanarak IB'nin özel görünümünüzü yeniden çizmesini sağlamak için IB_DESIGNABLE ile tamamlayın: method developer.apple.com/library/ios/recipes/…
txulu

3
Bu harika, eğer arabirim satırından önce .h dosyasına IB_DESIGNABLE yazarsanız, .m'ye @dynamic satır eklemenize gerek yoktur
Jasmeet

@ user1618612 çözünürlük ile ilgisi yoktur, sadece normal katman özelliklerini ayarlamaktadır.
iHulk

11

İçin Swift 3 ve 4 Eğer kullanım çekinmiyorsanız, IBInspectables, 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 benim için en iyi çözüm
Mục Đồng

Harika bir çözüm, teşekkürler u
Ebtehal___

7

bu özellikleri ayarlayabilse de, aslında IB'ye yansıtmaz. Yani esasen IB'de kod yazıyorsanız, bunu kaynak kodunuzda da yapabilirsiniz.


1
MVC'ye Hoşgeldiniz! Sen asla kod olmamalıdır özellikleri görüntülemek !
Alejandro Iván

2
^ MVC bu değildir.
Andrew Plummer

1
Bu kodun% 95'inin denetleyiciye girdiği zaman göz önüne alındığında, aynı zamanda MVC'dir, elbette görüşünüzü düzgün bir şekilde alt sınıflara ayırmalı veya genişletmelisiniz, daha sonra kodlama üzerinden sadece yapılandırmasını :-)
Daniele Bernardini

4

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.


10
Geçici çözümler artık zamandan tasarruf sağlar ve gelecekte çok daha fazla zaman harcar.
Lachezar Todorov

0

Sadece bir layer.masksToBounds = trueşeyleri ayarladığınızda ve dinlediğinizde kesinlikle mümkündür .


-1

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 :

UIView / UIButton vb.

customUIView.layer.cornerRadius = 10

Sınır Kalınlığı

pcustomUIView.layer.borderWidth = 2

Sınır rengi

customUIView.layer.borderColor = UIColor.blue.cgColor

Soru çok spesifik ve Arayüz Oluşturucu'dan nasıl yapılacağını sor. Cevabınız ilgisiz.
Shinnyx

-5

Lütfen şu 2 basit kod satırını ekleyin:

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

İyi çalışacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.