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

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

+176
06 сент. '12 в 13:31
источник поделиться
10 ответов

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

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

layer.cornerRadius
layer.borderWidth
layer.borderColor

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

example

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

enter image description here

+374
05 апр. '13 в 17:28
источник

Ответ 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!)
        }
    }
}
+178
01 авг. '13 в 12:19
источник
другие ответы

Связанные вопросы


Похожие вопросы

Аналогичный ответ 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":

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

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

+76
12 февр. '16 в 21:38
источник

Вы можете создать категорию 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.. Нет необходимости импортировать категорию в любом месте, просто добавьте файлы категорий в проект и просмотрите эти свойства в раскадровке.

+57
20 мая '15 в 11:13
источник

Для 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
        }
    }
}
+8
15 июл. '17 в 13:02
источник

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

+7
28 мая '13 в 8:06
источник

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

+4
19 февр. '14 в 6:18
источник

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

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

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

customUIView.layer.cornerRadius = 10

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

pcustomUIView.layer.borderWidth = 2

Цвет границы

customUIView.layer.borderColor = UIColor.blue.cgColor
0
12 июн. '19 в 9:28
источник

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

-1
12 окт. '18 в 6:00
источник

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

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

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

-4
06 февр. '18 в 6:45
источник

Посмотрите другие вопросы по меткам или Задайте вопрос