Можно ли установить свойства границы UIView из interface builder?
можно ли управлять свойствами границы UIView (цвет, толщина и т. д...) непосредственно из interface builder или я могу сделать это только программно?
8 ответов:
на самом деле вы можете установить некоторые свойства слоя представления через interface builder. Я знаю, что я могу установить borderWidth слоя и cornerRadius через xcode. borderColor не работает, вероятно, потому, что слой хочет CGColor вместо UIColor.
возможно, вам придется использовать строки вместо чисел, но это работает!
layer.cornerRadius layer.borderWidth layer.borderColor
ответ Rich86Man правильный, но вы можете использовать категории для прокси-свойств, таких как слой.необходимо. (От ConventionalC 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.м:
#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
результат будет очевиден во время выполнения, а не в Xcode.
Edit: Вам также нужно установить
layer.borderWidth
to по крайней мере 1, чтобы увидеть границу с выбранным цветом.В Swift 2.0:
extension CALayer { var borderUIColor: UIColor { set { self.borderColor = newValue.CGColor } get { return UIColor(CGColor: self.borderColor!) } } }
В Swift 3.0:
extension CALayer { var borderUIColor: UIColor { set { self.borderColor = newValue.cgColor } get { return UIColor(cgColor: self.borderColor!) } } }
похожий ответ на один iHulk, но в Swift
Добавить файл с именем UIView.swift в вашем проекте (или просто вставьте это в любой файл):
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 } } }
тогда это будет доступно в Interface Builder для каждой кнопки, imageView, label и т. д. в панели утилиты > инспектор атрибутов:
Примечание: граница будет отображаться только во время выполнения.
вы можете сделать категорию UIView и добавить это .H-файл из категории
@property (nonatomic) IBInspectable UIColor *borderColor; @property (nonatomic) IBInspectable CGFloat borderWidth; @property (nonatomic) IBInspectable CGFloat cornerRadius;
Теперь добавьте это .файл м
@dynamic borderColor,borderWidth,cornerRadius;
и это . файл м
-(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]; }
Теперь вы увидите это в своей раскадровке для всех подклассов UIView (UILabel, UITextField, UIImageView и т. д.)
вот и все.. Не нужно импортировать категорию в любом месте, просто добавьте файлы категории в проект и посмотрите эти свойства в окне раскадровка.
хотя это может установить свойства, он на самом деле не отражает В IB. Поэтому, если вы по существу пишете код В IB, вы можете также сделать это в своем исходном коде
на Swift 3 и 4, если вы готовы использовать
IBInspectable
s, Вот это:@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 } } }