0

我有一个两部分的问题。首先,我想添加边框颜色 alpha 作为自定义属性,如图所示。

在此处输入图像描述

但我注意到的第一件事是,要设置边框颜色CGColor,必须使用 a 而不是 anUIColor并且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
    }
}

我确实在用户定义的运行时属性中得到了这个,但它不会生效。

在此处输入图像描述

我的猜测是因为所有用户定义的运行时属性都是在使用的实际函数之后调用的,而我的不是真正的函数,更多的是自定义函数来获得我想要的。我也知道您可以使用颜色选择器选择 alpha,但是对于我正在做的事情,如果它们是分开的会很好。

最后,作为第二个问题,在增加或减少值的箭头上,它跳了一个,但在 Xcode 的 alpha 框上它只跳了 0.05 并且不能低于 0 或高于 1。我怎样才能添加这种排序我的用户定义的运行时属性的功能?

编辑 这是我为 UIView 提供的完整扩展代码,它适用于除边框 alpha 之外的所有内容。

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
    }
}
}
4

1 回答 1

0

borderColor我的第一个想法是,关于您的以及borderAlpha首先评估哪个可能存在根本的不确定性。对此没有任何了解或保证,因此如果发生borderAlpha设置然后borderColor,borderAlpha将不会被神奇地重新评估。实际上,这里的相互依赖引入了一种不确定性,这可能解释了我们经验的差异。因此,将 alpha 设置为颜色的一部分可能会更好。

我们可以猜测这可能是正确的,因为你的borderAlpha作品对我来说很好:

在此处输入图像描述

我们可以猜测,因为它对您不起作用,所以这种差异仅仅是机会;我很幸运,因为 myborderAlpha显然是在 my 之后评估的borderColor,但我们大概不能指望这一点。

顺便说一句,我让你的阴影属性也能正常工作:

在此处输入图像描述

你一定已经注意到它们没有工作,对吧?那是因为这条线:

clipsToBounds = newValue > 0

同样,这可以随时出现并将您的设置clipsToBoundsfalse,从而切断阴影。(或者也许他们正在为你工作,这又只是一个关于事物评估顺序的运气问题;这里的相互依赖clipsToBounds是设置的cornerRadius但会影响影子。

简而言之,我认为我们在这里学到的是,您需要保持这些属性彼此正交(独立)。

于 2017-03-06T18:27:38.867 回答