Ответы:
Вам нужно использовать слой вида, чтобы установить свойство границы. например:
#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
Вам также нужно связаться с QuartzCore.framework для доступа к этой функции.
__bridge CGColorRef
. Это не работает. Это должно быть [UIColor blackColor].CGColor
как указано в ответе.
#import <QuartzCore/QuartzCore.h>
больше не нужен.
Начиная с последней версии XCode, есть лучшее решение для этого:
С @IBInspectable
вы можете установить атрибуты непосредственно из внутриAttributes Inspector
.
Это устанавливает User Defined Runtime Attributes
для вас:
Есть два подхода к настройке:
Вариант 1 (с живым обновлением в раскадровке)
MyCustomView
.UIView
.@IBDesignable
(это делает обновление View активным). *@IBInspectable
MyCustomView
`
@IBDesignable
class MyCustomView: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
* @IBDesignable
работает только при установке в началеclass MyCustomView
Вариант 2 (не работает с Swift 1.2, см. Комментарии)
Расширьте свой класс UIView:
extension UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
Таким образом, ваш вид по умолчанию всегда содержит эти дополнительные редактируемые поля Attributes Inspector
. Еще одним преимуществом является то, что вам не нужно менять класс MycustomView
каждый раз. Однако одним из недостатков этого является то, что вы увидите свои изменения только при запуске приложения.
Вы также можете создать рамку с цветом вашего желания.
view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
* r, g, b - значения от 0 до 255.
r
, g
и , b
вероятно , следует поплавки; делители тоже должны быть поплавками r / 255.0
.
Добавьте следующие @IBInspectables в расширение UIView
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
}
И тогда вы сможете установить атрибуты borderColor и borderWidth непосредственно из инспектора атрибутов. Смотрите прикрепленное изображение
Когда я использую решение CALayer Владимира, и в верхней части представления у меня есть анимация, например, модальное отключение UINavigationController, я вижу, что происходит много глюков и возникают проблемы с производительностью при рисовании.
Итак, еще один способ добиться этого, но без сбоев и потери производительности, - создать пользовательский UIView и реализовать drawRect
сообщение следующим образом:
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(contextRef, 1);
CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0);
CGContextStrokeRect(contextRef, rect);
}
setNeedsDisplay
представление. Это заставит перерисовать UIView и неявно перезвонит drawRect
. Не проверено, tho ...
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
Попробуйте этот код:
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
Я бы не советовал переопределять drawRect из-за снижения производительности.
Вместо этого я бы изменил свойства класса, как показано ниже (в вашем пользовательском интерфейсе):
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.borderWidth = 2.f;
self.layer.borderColor = [UIColor redColor].CGColor;
}
return self;
Я не видел никаких глюков при использовании вышеупомянутого подхода - не уверен, почему включение initWithFrame останавливает это ;-)
Я хотел добавить это к ответу @ marczking ( вариант 1 ) в качестве комментария, но мой скромный статус в StackOverflow препятствует этому.
Я сделал ответ @ marczking на Objective C. Работает как шарм, спасибо @marczking!
UIView + Border.h:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface UIView (Border)
-(void)setBorderColor:(UIColor *)color;
-(void)setBorderWidth:(CGFloat)width;
-(void)setCornerRadius:(CGFloat)radius;
@end
UIView + Border.m:
#import "UIView+Border.h"
@implementation UIView (Border)
// Note: cannot use synthesize in a Category
-(void)setBorderColor:(UIColor *)color
{
self.layer.borderColor = color.CGColor;
}
-(void)setBorderWidth:(CGFloat)width
{
self.layer.borderWidth = width;
}
-(void)setCornerRadius:(CGFloat)radius
{
self.layer.cornerRadius = radius;
self.layer.masksToBounds = radius > 0;
}
@end
@IBInspectable работает для меня на iOS 9, Swift 2.0
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set(newValue) {
layer.cornerRadius = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
Если вы не хотите редактировать слой UIView, вы всегда можете встроить представление в другое представление. В родительском представлении цвет фона будет установлен на цвет границы. Это также будет немного больше, в зависимости от ширины границы.
Конечно, это работает только в том случае, если ваш вид не прозрачен и вам нужен только один цвет рамки. ФП хотел иметь границу в самом представлении, но это может быть жизнеспособной альтернативой.
Если вы хотите добавить разные границы на разных сторонах, возможно, добавьте подпредставление с определенным стилем, способ легко придумать.