【问题标题】:Adding Custom Border Color Alpha to Attribute Inspector将自定义边框颜色 Alpha 添加到属性检查器
【发布时间】:2017-07-26 17:01:45
【问题描述】:

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

但我首先注意到的是,要设置边框颜色,必须使用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
    }
}

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

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

最后,作为第二个问题,在增加或减少值的箭头上,它会跳 1,但在 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
    }
}
}

【问题讨论】:

  • 您的密钥路径都不起作用,因为您忘记在密钥路径中包含layer。类似地,视图没有圆角半径、边框颜色、边框宽度或边框 alpha;要将这些中的任何一个编写为可检查的,您需要为 它们中的每一个设置一个设置器,以便与视图的layer 交谈。
  • 哦,我实际上已经完成了所有这些工作。抱歉,我现在将包含完整代码。

标签: swift3 alpha uicolor xcode8.2 cgcolor


【解决方案1】:

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

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

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

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

您一定注意到它们没有工作,对吧?那是因为这行:

clipsToBounds = newValue > 0

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

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

【讨论】:

  • 有趣。我见过建议使用类的其他代码(不包括边框 alpha),我只是不确定这会如何影响我的对象。因为它们中的大多数都继承自 UIView,所以它们似乎都得到了我添加的代码。我只是不确定如果我将 UILabel 的类更改为基于 UIView 构建的自定义类会发生什么...然后我是否需要为每个对象创建一个单独的类才能使用它?
  • 顺便说一句,你的代码有缺陷;您需要删除此行:clipsToBounds = newValue &gt; 0 它正在阻止您的影子代码工作。
  • "最后,作为第二个问题,在增加或减少值的箭头上,它跳了一个,但在 Xcode 的 alpha 框上它只跳了 0.05,不能低于 0 或更高比 1. 我如何将这种功能添加到我的用户定义的运行时属性中?”我很确定没有办法。这将对 Apple 提出很好的功能要求。
  • 哦,关于你原来的问题,再想一想。对于您的borderColorborderAlpha,对于哪个将首先评估,是否存在根本的不确定性?对此没有任何了解或保证,因此如果碰巧设置了borderAlpha,然后borderColorborderAlpha 将不会被神奇地重新评估。实际上,这里的相互依赖引入了一种不确定性,这可能是我们经验差异的原因。因此,将 alpha 设置为颜色的一部分可能会更好。
  • 这其实我也想过,我想你可能是对的,最好在颜色选择器中这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2023-04-04
  • 1970-01-01
  • 2013-01-06
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多