Відповіді:
Для встановлення властивості межі потрібно використовувати шар перегляду. наприклад:
#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
(завдяки цьому оновлення Переглянути в прямому ефірі). *@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
. Не перевірено, тха ...
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 через те, що спричинило хіт продуктивності.
Натомість я б змінив властивості класу, як показано нижче (у вашому користувальницькому uiview):
- (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 відповідь на ціль 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 + межа:
#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, ви завжди зможете вставити його в інший вигляд. Батьківський вигляд мав би його колір тла встановити на колір межі. Він також буде трохи більшим, залежно від того, якою шириною ви хочете бути кордоном.
Звичайно, це працює лише в тому випадку, якщо ваш погляд не прозорий і вам потрібен лише один колір рамки. ОП хотіла кордону саме погляду, але це може бути життєздатною альтернативою.
Якщо ви хочете додати різні рамки з різних сторін, можливо, додайте підзагляд із певним стилем - це спосіб, який легко придумати.