Можно ли управлять свойствами границ UIView (цвет, толщина и т. Д.) Непосредственно из конструктора интерфейса, или я могу сделать это только программно?
Можно ли управлять свойствами границ UIView (цвет, толщина и т. Д.) Непосредственно из конструктора интерфейса, или я могу сделать это только программно?
Ответы:
На самом деле вы можете установить некоторые свойства слоя представления через конструктор интерфейса. Я знаю, что я могу установить borderWidth и cornerRadius слоя через xcode. borderColor не работает, вероятно, потому что слой хочет CGColor вместо UIColor.
Возможно, вам придется использовать строки вместо чисел, но это работает!
layer.cornerRadius
layer.borderWidth
layer.borderColor
Обновление: layer.masksToBounds = true

Ответ Rich86Man верен, но вы можете использовать категории для прокси-свойств, таких как layer.borderColor. (От обычного C 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
Результат будет очевиден во время выполнения, а не в Xcode.
Изменить : Вам также нужно установить layer.borderWidthпо крайней мере 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
}
}
}
Тогда это будет доступно в Интерфейсном Разработчике для каждой кнопки, imageView, метки и т. Д. В Панели утилит> Инспектор атрибутов:
Примечание: граница появится только во время выполнения.
@IBDesignableс начала расширения.
Вы можете создать категорию UIView и добавить ее в .h файл категории
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Теперь добавьте это в файл .m
@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 и т. д.)

Вот и все .. Нет необходимости импортировать категорию куда угодно, просто добавьте файлы категории в проект и посмотрите эти свойства в раскадровке.
Для Swift 3 и 4 , если вы хотите использовать IBInspectables, вот что:
@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
}
}
}
хотя это может устанавливать свойства, на самом деле это не отражается в IB. Так что, если вы по сути пишете код в IB, вы можете сделать это в исходном коде.
Если вы хотите сэкономить время, просто используйте два UIViewsповерх друг друга, один сзади - цвет рамки, а другой - меньше, что дает эффект окаймления. Я тоже не думаю, что это элегантное решение, но если Apple заботится немного больше, вам не нужно этого делать.
Это абсолютно возможно только тогда, когда вы сидите layer.masksToBounds = trueи отдыхаете.
Раскадровка не работает для меня все время, даже после того, как вы попробуете все решения здесь
Так что это всегда идеальный ответ, используя код, просто создайте экземпляр IBOutlet из UIView и добавьте свойства
Короткий ответ :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
Длинный ответ:
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
Пожалуйста, добавьте эти 2 простые строки кода:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
Это будет работать нормально.