前景色不适用于属性文本

时间:2017-11-06 08:46:52

标签: ios swift uilabel

我想在UILabel内合并图片和文字。为了实现这一点,我使用了这部分代码:

let attributedText = NSMutableAttributedString(string: "")
let attachment = NSTextAttachment()
attachment.image = image.withRenderingMode(.alwaysTemplate)
attachment.bounds = CGRect(x: 0, y: 0, width: 20, height: 20)
attributedText.append(NSAttributedString(attachment: attachment))
attributedText.append(NSMutableAttributedString(string: "test",
attributedText.addAttribute(NSAttributedStringKey.foregroundColor,
                value: UIColor.white,
                range: NSMakeRange(0, attributedText.length))

文本具有白色前景色,但遗憾的是图像仍然是原始颜色。有趣的是,当我将第一行更改为此(初始化程序内的空格)时:

let attributedText = NSMutableAttributedString(string: " ")

然后一切正常。但问题是标签内的整个文本由于空格而偏移。如何在不添加空格的情况下更改图像颜色?

3 个答案:

答案 0 :(得分:4)

您必须使用图形上下文来反转颜色。我可能会把它作为UIImage的扩展。

示例swift代码如下。

    extension UIImage {
    func imageWithColor(color:UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height);
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context?.clip(to: rect, mask: self.cgImage!)
        context?.setFillColor(color.cgColor)
        context?.fill(rect)
        let imageFromCurrentContext = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return UIImage(cgImage: imageFromCurrentContext!.cgImage!, scale: 1.0, orientation:.downMirrored)
    }
}

答案 1 :(得分:1)

这种行为似乎是UIKit中的一个错误。唉,我不知道一个解决方案,希望其他人能做到,但现在这里有一个解决方法:

您可以在将图像添加为文本附件之前为图像着色。一种简单的方法是使用第三方框架,例如这一个:https://github.com/vilanovi/UIImage-Additions

然后您可以简单地写下image.withRenderingMode(...)而不是attachment.image = image.add_tintedImage(with: .white, style: ADDImageTintStyleKeepingAlpha)

import DS from 'ember-data';

export default DS.Model.extend({
  type: DS.attr('string'),
  email: DS.attr('string'),
  days: DS.attr('number'),
  isInstant: DS.attr('boolean'),
  cutHours: DS.attr('number')
});

答案 2 :(得分:0)

结果证明,UIKit中的错误仍然存​​在,但是为了避免由于空格而导致的偏移量,可以使用空字符串代替空格。 只要做:

<p-menubar [model]="items">
  <ng-template pTemplate="start">
    <img src="/assets/images/logo.png" height="40" class="p-mr-2" alt="brand logo">
  </ng-template>
  <ng-template pTemplate="end">
    <label>
      <input type="text" pInputText placeholder="Szukaj">
    </label>
    <button type="button" (click)="logout()" pButton label="Wyloguj" icon="pi pi-power-off" style="margin-left:.25em"></button>
  </ng-template>
</p-menubar>

代替

let attributedText = NSMutableAttributedString(string: "\0")