Можно ли управлять свойствами границ 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 , если вы хотите использовать 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
}
}
}
хотя это может устанавливать свойства, на самом деле это не отражается в 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
Это будет работать нормально.