【问题标题】:Gradient Color over Template Image in Swift 4Swift 4中模板图像上的渐变颜色
【发布时间】:2017-11-07 04:22:45
【问题描述】:

我正在尝试使用 swift 4 在我的应用程序中创建一个聊天应用程序。

我希望聊天气泡以我以编程方式设置的渐变颜色显示。

我通过将图像渲染为以下模板,通过纯色实现了这一点:

    let TestImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 300, height: 200))
    let TestImage = ChatBubble
    let TestImage2 = TestImage.resizableImage(withCapInsets: TestInsets, resizingMode: .stretch).withRenderingMode(UIImageRenderingMode.alwaysTemplate)
    TestImageView.image = TestImage2
    TestImageView.tintColor = UIColor.red

怎么做?

更新:我是通过 Mr.Matt 解决方案制作的,但在调整尺寸时遇到了一些麻烦。这是我在类中制作后的最终代码:

类 UIChatBubbleView: UIView {

override func draw(_ rect: CGRect) {
    let ChatBubbleView = UIImageView(frame: rect)
    let BubbleInsets = UIEdgeInsets(top: 100, left: 200, bottom: 240, right: 240)
    let BubbleImage = #imageLiteral(resourceName: "ChatBubble").resizableImage(withCapInsets: BubbleInsets, resizingMode: .stretch)
    ChatBubbleView.image = BubbleImage
    let MyView = UIView(frame: ChatBubbleView.bounds)
    MyView.layer.contents = ChatBubbleView.image?.cgImage
    let GradientLayer = CAGradientLayer()
    GradientLayer.frame = ChatBubbleView.bounds
    GradientLayer.colors = [UIColor.red.cgColor,UIColor.blue.cgColor]
    GradientLayer.mask = ChatBubbleView.layer

    MyView.layer.addSublayer(GradientLayer)
    MyView.layer.shadowColor = UIColor.black.cgColor
    MyView.layer.shadowOffset = CGSize(width: 3.0, height: 3.0)
    MyView.layer.shadowOpacity = 0.5
    MyView.layer.shadowRadius = 3
    self.addSubview(MyView)
}

override init(frame:CGRect) {
    super.init(frame:frame)
    self.isOpaque = false
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

最终的结果是这样的:

我希望渐变气泡的大小与黑色气泡的大小完全相同。

【问题讨论】:

  • 绘制渐变并遮盖它。
  • (例如我的答案在这里:stackoverflow.com/a/23202718/341994
  • 我会用什么掩盖它?
  • 按聊天气泡形状。 (正如在链接的答案中,渐变被贝塞尔路径形状所掩盖。)
  • 抱歉,聊天气泡是 PNG 图像。如何从中制作形状?

标签: ios swift uiimageview uiimage


【解决方案1】:

绘制渐变(CAGradientLayer 是最简单的方法)。然后使用您的气泡形状来掩盖渐变。

例如,这是一个气泡形状示例:

这是掩盖红色到橙色渐变的形状:

现在您可以将文本放入气泡中(作为标签、CATextLayer 或任何方便的方式)。

【讨论】:

  • 好的,谢谢,我将搜索如何将图像转换为蒙版的代码,该蒙版可以作为 CAShapeLayer 应用于 CAGradientLayer。感谢您的提示。
  • 没有什么可以转换的。我所做的只是使用图像视图中的气泡形状图像作为包含渐变层的视图的蒙版。
  • 非常感谢,让我感到困惑的是尝试从提供的图像制作 CAShapeLayer 作为链接帖子中的答案。但现在我发现我必须通过 CALayer 创建一个蒙版,并将其内容设为bubbleImage.cgimage,然后将渐变图层蒙版,并将其仅添加到聊天气泡的子图层,而不是您帖子的蒙版图层。然而,没有你的帮助,我离成功还很远。再次感谢。
  • 没问题,虽然我做的比这更简单。 :) 因为,正如我所说,一个视图本身可以有一个mask,这是另一个视图。所以我用一个 UIImageView 拿着气泡作为视图mask
  • 现在试过了,效果很好,它比旧的解决方案更好,因为它保留了原始 UIImageView 的内容缩放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2015-04-14
相关资源
最近更新 更多