ios [__NSCF类型集]:基于位置的宽度,调用了带有NSAttributedString:draw()的无法识别的选择器

0pizxfdo  于 2023-01-06  发布在  iOS
关注(0)|答案(1)|浏览(116)

如果运行下面的代码,则会导致异常
'NS无效参数异常',原因:'-[__NSCF类型集合]:发送到示例0x 283130 be 0 '的无法识别的选择器
但是,可以通过将positionRect中的宽度值从100.0减小来删除该异常,例如,将其设置为类似50.0的值将删除该异常。
但是为什么会这样呢?为positionRect指定的宽度值为100.0,这比imageSize的宽度要短得多。即使存在一些大小问题,为什么会出现无法识别的选择器异常呢?

let imageSize = CGSize(width: 400, height: 100)
let testRenderer = UIGraphicsImageRenderer(size: imageSize)
let testImage = testRenderer.image { context in
    context.cgContext.setFillColor(UIColor.black.cgColor)
    context.fill(CGRect(origin: .zero, size: imageSize))
    
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .left
    let attributes: [NSAttributedString.Key: Any] = [
        .font: UIFont.systemFont(ofSize: 8.0),
        .paragraphStyle: paragraphStyle,
        .foregroundColor: UIColor.white.cgColor
    ]
    
    let attributedString = NSAttributedString(string: "This is some text", attributes: attributes)
    let positionRect = CGRect(x: 10, y: 10, width: 100.0, height: 8.0)
    attributedString.draw(with: positionRect, options: .usesLineFragmentOrigin, context: nil)
}
ltqd579y

ltqd579y1#

出现此问题是因为在attributes字典中为.foregroundColor键传递了CGColor而不是UIColordocumentation声明:
在macOS中,此属性的值为NSColor示例。在iOS、tvOS、watchOS和Mac Catalyst中,此属性的值为UIColor示例。使用此属性可指定呈现期间文本的颜色。如果未指定此属性,文本将呈现为黑色。
NSAttributedString代码正试图调用set提供的颜色,如错误所示。这是在显示Objective-C语法-[__NSCFType set]的错误消息中指出的。这表明set正在__NSCFType类型的对象上被调用,该类型是表示许多Core Foundation(和Core Graphics)类型的内部类型,如CGColor
简而言之,更改行:

.foregroundColor: UIColor.white.cgColor

致:

.foregroundColor: UIColor.white

相关问题