Czy można kontrolować właściwości obramowania UIView (kolor, grubość itp.) Bezpośrednio z konstruktora interfejsu, czy mogę to zrobić tylko programowo?
Czy można kontrolować właściwości obramowania UIView (kolor, grubość itp.) Bezpośrednio z konstruktora interfejsu, czy mogę to zrobić tylko programowo?
Odpowiedzi:
W rzeczywistości można ustawić niektóre właściwości warstwy widoku za pomocą konstruktora interfejsów. Wiem, że mogę ustawić borderWidth i cornerRadius warstwy poprzez xcode. borderColor nie działa, prawdopodobnie dlatego, że warstwa chce CGColor zamiast UIColor.
Być może będziesz musiał użyć Ciągów zamiast liczb, ale to działa!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Aktualizacja: layer.masksToBounds = true
Odpowiedź Rich86Man jest poprawna, ale możesz użyć kategorii do określenia właściwości proxy, takich jak layer.borderColor. (Z konwencjonalnego CocoaPod)
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
Wynik będzie widoczny podczas działania, a nie w Xcode.
Edycja : Musisz także ustawić layer.borderWidth
co najmniej 1, aby zobaczyć ramkę z wybranym kolorem.
W Swift 2.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
W Swift 3.0:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
Podobna odpowiedź do iHulk, ale w Swift
Dodaj plik o nazwie UIView.swift do swojego projektu (lub po prostu wklej go w dowolnym pliku):
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
}
}
}
Następnie będzie to dostępne w Konstruktorze interfejsów dla każdego przycisku, imageView, etykiety itp. W panelu Narzędzia> Inspektor atrybutów:
Uwaga: ramka pojawi się tylko w czasie wykonywania.
@IBDesignable
z początku rozszerzenia.
Możesz utworzyć kategorię UIView i dodać ją do pliku .h kategorii
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Teraz dodaj to do pliku .m
@dynamic borderColor,borderWidth,cornerRadius;
i to również w. plik 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];
}
teraz zobaczysz to w swojej serii ujęć dla wszystkich podklas UIView (UILabel, UITextField, UIImageView itp.)
To wszystko .. Nie trzeba importować kategorii w dowolnym miejscu, wystarczy dodać pliki kategorii w projekcie i zobaczyć te właściwości w serii ujęć.
W przypadku Swift 3 i 4 , jeśli chcesz użyć IBInspectable
s, jest to:
@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
}
}
}
chociaż może to ustawić właściwości, w rzeczywistości nie odzwierciedla się w IB. Więc jeśli zasadniczo piszesz kod w IB, równie dobrze możesz to zrobić w kodzie źródłowym
Jeśli chcesz zaoszczędzić czas, po prostu użyj dwóch UIViews
na sobie, jeden z tyłu ma kolor obramowania, a ten z przodu mniejszy, co daje efekt graniczny. Nie wydaje mi się, żeby było to również eleganckie rozwiązanie, ale jeśli Apple trochę bardziej to obchodzi, nie powinieneś tego robić.
Jest to absolutnie możliwe tylko wtedy, gdy ustawiasz layer.masksToBounds = true
i odpoczywasz.
Storyboard nie działa dla mnie przez cały czas, nawet po wypróbowaniu wszystkich rozwiązań tutaj
Tak więc zawsze jest idealna odpowiedź przy użyciu kodu, wystarczy utworzyć instancję IBOutlet UIView i dodać właściwości
Krótka odpowiedź :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Długa odpowiedź :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Dodaj 2 proste linie kodu:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Będzie dobrze działać.