Почему свойства с тегом @IBInspectable не работают?

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

Мне удалось показать свойства. Но что бы я не ставил на раскадровке, результат все равно как если бы их там не было. Рамки нет, хотя я установил рамку шириной 2 и черным цветом. Это не отображается ни на раскадровке, ни во время выполнения. Я установил ширину границы 2, но во время выполнения я печатаю значение ширины границы в didViewLoad, и результат равен 0. Что может быть не так?

@IBDesignable extension view: 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 = borderWidth;
        }
    }

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

}

И это тоже не работает:

@IBDesignable class BOView: 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 = borderWidth;
        }
    }

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

}

person Chen Li Yong    schedule 18.10.2016    source источник
comment
вы включили меню EditorAutomatically Refresh Views в IB?   -  person holex    schedule 18.10.2016
comment
@holex эта опция уже включена.   -  person Chen Li Yong    schedule 18.10.2016


Ответы (1)


Попробуйте использовать newValue вместо реального значения.

Например,

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

Чен, я предпочитаю то, как вы это делаете, но также обратите внимание, что то, что вы пытаетесь сделать, возможно напрямую из раскадровки без использования IBDesignable. Вы можете установить свойства слоя в определяемых пользователем атрибутах среды выполнения.

введите описание изображения здесь

person Carien van Zyl    schedule 18.10.2016
comment
Вы проверили этот ответ перед публикацией? это работает? - person holex; 18.10.2016
comment
Ооооооооооооооооооооооооооооооооооооооооооооооооооооооооо! Да, мне нужно использовать newValue вместо имени переменной. Спасибо!!!! Но IBDesignable по-прежнему не работает... но это большой скачок!! - person Chen Li Yong; 18.10.2016
comment
Подождите, IBDesignable теперь работает!! Я не знаю почему! Может быть, мне нужно закрыть и снова открыть Xcode. Спасибо! - person Chen Li Yong; 18.10.2016
comment
Удовольствие. Ваше расширение работает? Это может быть действительно удобно. - person Carien van Zyl; 18.10.2016
comment
@CarienvanZyl да, это так! Теперь передо мной открылся целый новый мир и возможности, лол. Прошли те дни, когда мне приходилось реализовывать контроллер и запускать его, просто чтобы посмотреть, как выглядит граница. Я думал, что эта контролируемая и проектируемая штука очень сложна, поэтому я воздерживаюсь от изучения этого до сих пор. О, я не мог быть дальше от правды, лол. - person Chen Li Yong; 19.10.2016