Возможно ли установить свойства границы UIView из конструктора интерфейса?

Можно ли управлять свойствами границы UIView (цвет, толщина и т.д.) непосредственно из конструктора интерфейса, или я могу делать это только программно?

Ответ 1

На самом деле вы можете установить некоторые свойства слоя представления через конструктор интерфейса. Я знаю, что я могу установить слой borderWidth и cornerRadius через xcode. borderColor не работает, вероятно, потому что слой хочет CGColor вместо UIColor.

Возможно, вам придется использовать строки вместо чисел, но это работает!

layer.cornerRadius
layer.borderWidth
layer.borderColor

Обновление: layer.masksToBounds = true

example

Обновление: выберите соответствующий тип для Keypath:

enter image description here

Ответ 2

Ответ Rich86Man верен, но вы можете использовать категории для прокси-свойств, таких как layer.borderColor. (Из 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.m:

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

-(void)setBorderUIColor:(UIColor*)color
{
    self.borderColor = color.CGColor;
}

-(UIColor*)borderUIColor
{
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

Interface Builder

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!)
        }
    }
}

Ответ 3

Аналогичный ответ iHulk one, но в 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, метки и т.д. в панели "Утилиты" > "Attributes Inspector":

Инспектор атрибутов

Примечание: граница будет отображаться только во время выполнения.

Ответ 4

Вы можете создать категорию UIView и добавить ее в .h файл категории

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

Теперь добавьте это в .m файл

@dynamic borderColor,borderWidth,cornerRadius;

и это тоже. m file

-(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 и т.д.)

enter image description here

Thats it.. Нет необходимости импортировать категорию в любом месте, просто добавьте файлы категорий в проект и просмотрите эти свойства в раскадровке.

Ответ 5

Для 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
        }
    }
}

Ответ 6

в то время как это может установить свойства, оно фактически не отражается в IB. Поэтому, если вы в основном пишете код в IB, вы также можете сделать это в своем исходном коде

Ответ 7

Если вы хотите сэкономить время, просто используйте два UIViews друг на друга, тот, который сзади, является цветом границы, а другой спереди меньше, придавая граничный эффект. Я не думаю, что это тоже изящное решение, но если Apple позаботится немного больше, вам не придется этого делать.

Ответ 8

Раскадровка не работает для меня все время, даже после того, как вы попробуете все решения здесь

Так что это всегда идеальный ответ, используя код, просто создайте экземпляр IBOutlet из UIView и добавьте свойства

Закругленные углы UIView/UIButton и т.д.

customUIView.layer.cornerRadius = 10

Толщина границы

pcustomUIView.layer.borderWidth = 2

Цвет границы

customUIView.layer.borderColor = UIColor.blue.cgColor

Ответ 9

Это абсолютно возможно, только если вы установили layer.masksToBounds = true и делаете все остальное.

Ответ 10

Пожалуйста, добавьте эти 2 простые строки кода:

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

Это будет работать нормально.