2015-03-04 4 views
51

Я устанавливаю CornerRadius и BorderWidth для UIbutton в пользовательских атрибутах времени выполнения. Без добавления layer.borderColor работает Хорошо и отображается граница черного цвета. Но когда добавьте layer.borderColor не работает (не показывает границу).Изменение UIButton BorderColor в раскадровке

enter image description here

ответ

116

Для Swift:

enter image description here

Swift 3:

extension UIView { 

    @IBInspectable var cornerRadius: CGFloat { 
     get { 
      return layer.cornerRadius 
     } 
     set { 
      layer.cornerRadius = newValue 
      layer.masksToBounds = newValue > 0 
     } 
    } 

    @IBInspectable var borderWidth: CGFloat { 
     get { 
      return layer.borderWidth 
     } 
     set { 
      layer.borderWidth = newValue 
     } 
    } 

    @IBInspectable var borderColor: UIColor? { 
     get { 
      return UIColor(cgColor: layer.borderColor!) 
     } 
     set { 
      layer.borderColor = newValue?.cgColor 
     } 
    } 
} 

Swift 2.2:

extension UIView { 

    @IBInspectable var cornerRadius: CGFloat { 
     get { 
      return layer.cornerRadius 
     } 
     set { 
      layer.cornerRadius = newValue 
      layer.masksToBounds = newValue > 0 
     } 
    } 

    @IBInspectable var borderWidth: CGFloat { 
     get { 
      return layer.borderWidth 
     } 
     set { 
      layer.borderWidth = newValue 
     } 
    } 

    @IBInspectable var borderColor: UIColor? { 
     get { 
      return UIColor(CGColor: layer.borderColor!) 
     } 
     set { 
      layer.borderColor = newValue?.CGColor 
     } 
    } 
} 
+0

это правильный ответ thanx –

+3

wow это лучший ответ. –

+0

привет, я создаю класс CustomeView в объективе c, но его не покажут в моем раскадровке Plz, помогите мне. –

72

Я получил ответ Изменить layer.borderColor к layer.borderColorFromUIColor

enter image description here

и добавить код в файл .m

#import <QuartzCore/QuartzCore.h> 
@implementation CALayer (Additions) 

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

@end 

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

Attribute Inspector

+1

не работает для меня :( –

+0

где мы должны написать этот код – jithin

+5

@jithin Я написал это как Swift расширения, вот код: расширение CALayer { функ setBorderColorFromUIColor (цвет : UIColor) { self.borderColor = color.CGColor } } – Guy

0

В случае Swift, функция не работает. Вам нужно вычисляемый свойство для достижения желаемого результата:

extension CALayer { 
    var borderColorFromUIColor: UIColor { 
     get { 
      return UIColor(CGColor: self.borderColor!) 
     } set { 
      self.borderColor = newValue.CGColor 
     } 
    } 
} 
5

Объяснение, возможно, теряется в некоторых других ответов здесь:

Причина, по которой это свойство не установлено, что layer.borderColor необходимо значение с типом CGColor.

Но только типы UIColor могут быть установлены с помощью пользовательских атрибутов Runtime Interface Builder!

Итак, вы должны установить UIColor для свойства прокси через Interface Builder, а затем перехватить этот вызов, чтобы установить эквивалентный CGColor в свойство layer.borderColor.

Это можно сделать, создав категорию на CALayer, установив путь ключа к уникальному новому «свойству» (borderColorFromUIColor) и в категории, переопределяющей соответствующий сеттер (setBorderColorFromUIColor:).

-1

Это работает для меня. Swift 3, xCode 8.3

Identity inspector (UIButton in this case

CALayer расширение:

extension CALayer { 
var borderWidthIB: NSNumber { 
    get { 
     return NSNumber(value: Float(borderWidth)) 
    } 
    set { 
     borderWidth = CGFloat(newValue.floatValue) 
    } 
} 
var borderColorIB: UIColor? { 
    get { 
     return borderColor != nil ? UIColor(cgColor: borderColor!) : nil 
    } 
    set { 
     borderColor = newValue?.cgColor 
    } 
} 
var cornerRadiusIB: NSNumber { 
    get { 
     return NSNumber(value: Float(cornerRadius)) 
    } 
    set { 
     cornerRadius = CGFloat(newValue.floatValue) 
    } 
} 

}

4

Swift 4, Xcode 9.2 - Использование IBDesignable и IBInspectable для создания пользовательских элементов управления и быстрый предварительный просмотр дизайна в Interface Builder.

Вот пример код в Swift, место чуть ниже UIKit в ViewController.swift:

@IBDesignable extension UIButton { 

    @IBInspectable var borderWidth: CGFloat { 
     set { 
      layer.borderWidth = newValue 
     } 
     get { 
      return layer.borderWidth 
     } 
    } 

    @IBInspectable var cornerRadius: CGFloat { 
     set { 
      layer.cornerRadius = newValue 
     } 
     get { 
      return layer.cornerRadius 
     } 
    } 

    @IBInspectable var borderColor: UIColor? { 
     set { 
      guard let uiColor = newValue else { return } 
      layer.borderColor = uiColor.cgColor 
     } 
     get { 
      guard let color = layer.borderColor else { return nil } 
      return UIColor(cgColor: color) 
     } 
    } 
} 

Если вы идете к атрибутам осматриваемым из точки зрения, вы должны найти эти свойства визуально, редактировать свойства :

enter image description here

изменения также отражены в User Defined Время воспроизведения Атрибуты:

enter image description here

Запуск во время сборки и Voila! вы увидите четкую закругленную кнопку с рамкой. ?

enter image description here