У меня вопрос из 2 частей. Сначала я хотел бы добавить альфа-канал границы в качестве пользовательского атрибута, например, как показано на этом рисунке.
Но первое, что я заметил, это то, что для установки цвета границы необходимо использовать CGColor
вместо UIColor
, а CGColor.alpha
доступен только для чтения.
Итак, я попытался использовать что-то подобное, но это не сработало.
@IBInspectable var borderAlpha: CGFloat {
set {
let borderCGColor = layer.borderColor
var color = UIColor(cgColor: borderCGColor!)
if (newValue < 0) {
color = color.withAlphaComponent(0)
layer.borderColor = color.cgColor
} else if (newValue > 1) {
color = color.withAlphaComponent(1)
layer.borderColor = color.cgColor
} else {
color = color.withAlphaComponent(newValue)
layer.borderColor = color.cgColor
}
}
get {
return layer.borderColor!.alpha
}
}
Я получаю это в пользовательских атрибутах среды выполнения, но это не влияет.
Я предполагаю, что все пользовательские атрибуты времени выполнения вызываются после фактической используемой функции, тогда как моя не является реальной функцией, а скорее пользовательской функцией, чтобы получить то, что я хочу. Я также знаю, что вы можете выбрать альфу с помощью селектора цвета, но для того, что я делаю, было бы неплохо, если бы они были отдельными.
Наконец, как второй вопрос, на стрелках, которые увеличивают или уменьшают значения, он прыгает на единицу, но в альфа-поле Xcode он прыгает только на 0,05 и не может опускаться ниже 0 или выше 1. Как я могу добавить этот вид функциональности для моих определяемых пользователем атрибутов среды выполнения?
EDIT Вот полный код расширения, который у меня есть для UIView, который работает для всего, кроме альфа-канала границы.
import UIKit
@IBDesignable extension UIView {
@IBInspectable var borderColor: UIColor? {
set {
layer.borderColor = newValue!.cgColor
}
get {
if let color = self.layer.borderColor {
return UIColor(cgColor: color)
} else {
return nil
}
}
}
@IBInspectable var borderAlpha: CGFloat {
set {
let borderCGColor = layer.borderColor
var color = UIColor(cgColor: borderCGColor!)
if (newValue < 0) {
color = color.withAlphaComponent(0)
layer.borderColor = color.cgColor
} else if (newValue > 1) {
color = color.withAlphaComponent(1)
layer.borderColor = color.cgColor
} else {
color = color.withAlphaComponent(newValue)
layer.borderColor = color.cgColor
}
}
get {
return layer.borderColor!.alpha
}
}
@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
}
}
@IBInspectable var shadowColor: UIColor? {
set {
layer.shadowColor = newValue!.cgColor
}
get {
if let color = self.layer.shadowColor {
return UIColor(cgColor: color)
} else {
return nil
}
}
}
@IBInspectable var shadowOffset: CGSize {
set {
layer.shadowOffset = newValue
}
get {
return layer.shadowOffset
}
}
@IBInspectable var shadowRadius: CGFloat {
set {
layer.shadowRadius = newValue
}
get {
return layer.shadowRadius
}
}
@IBInspectable var shadowOpacity: Float {
set {
if (newValue < 0) {
layer.shadowOpacity = 0
} else if (newValue > 1) {
layer.shadowOpacity = 1
} else {
layer.shadowOpacity = newValue
}
}
get {
return layer.shadowOpacity
}
}
}
layer
в ключевой путь. Точно так же вид не имеет углового радиуса, цвета границы, ширины границы или альфа-канала границы; чтобы написать любой из них как проверяемый, вам понадобится сеттер для каждого из них, чтобы общаться с представлениемlayer
. - person matt   schedule 06.03.2017