首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用UIKit的NSMutableParagraphStyle绘图方法忽略NSString

用UIKit的NSMutableParagraphStyle绘图方法忽略NSString
EN

Stack Overflow用户
提问于 2021-09-17 01:02:17
回答 1查看 59关注 0票数 0

我试图为iOS/iPadOS框架创建一个简单的text()函数,该框架只在一个坐标下在屏幕上显示文本。它授予全局textAlignment状态,可以设置为.center.left.right

我直接绘制图形上下文。

这里的问题是:函数可以工作,但是没有一个NSMutableParagraphStyle属性被授予。

代码语言:javascript
复制
func text(_ string: String, _ x: CGFloat, _ y: CGFloat) {
     let attributedString = NSAttributedString(string: string,
                                               attributes: attributes)
     attributedString.draw(at: CGPoint(x: x, y: y))
}

attributesparagraphStyle是全局变量:

代码语言:javascript
复制
var paragraphStyle: NSMutableParagraphStyle?
var attributes: [NSAttributedString.Key: Any] = [:]

它们由一个函数设置,该函数在任何时候更改设置时都会被调用:

代码语言:javascript
复制
func setTextAttributes() {
    paragraphStyle = NSMutableParagraphStyle()
    
    switch settings.textAlign {
    case .left:
        paragraphStyle?.alignment = .left
    case .right:
        paragraphStyle?.alignment = .right
    case .center:
        paragraphStyle?.alignment = .center
    }
   
    paragraphStyle?.lineSpacing = CGFloat(settings.textLeading)
       
    attributes = [
        .font: UIFont(name: settings.textFont, size: CGFloat(settings.textSize))!,
        .foregroundColor: settings.fill,
        .strokeWidth: -settings.strokeWeight,
        .strokeColor: settings.stroke,
        .paragraphStyle: paragraphStyle!
    ]
}

所有的文本设置都存储在一个设置结构中(在这里我将省略此设置),并且我在多个断点处检查了paragraphStyleattributes的状态,直到绘制文本为止。似乎当它进入NSString绘图方法时,它就被忽略了。

下面是在API中编写的一些示例代码:

代码语言:javascript
复制
line(200, 0, 200, height)
line(0, 120, width, 120)
textAlign(.right)
text("ABCD", 200, 120)
line(0, 200, width, 200)
textAlign(.center)
text("EFGH", 200, 200)
textAlign(.left)
line(0, 280, width, 280)
text("IJKL", 200, 280)

我的输出与左对齐的所有东西看起来都是这样的(增加行以表明所有的左对齐):

下面大致是我期望输出的样子(忽略字体更改):

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-17 05:22:40

您可以使用draw(in:),它允许您指定将在其中进行绘图的CGRect

在每一种对齐方式中,您都希望在与传递到方法的点不同的x偏移点处绘制字符串。

代码语言:javascript
复制
func text(_ string: String, _ x: CGFloat, _ y: CGFloat) {
     let attributedString = NSAttributedString(string: string,
                                               attributes: attributes)
    let size = attributedString.size()
    let xOffset: CGFloat
    switch attributes[.paragraphStyle]?.alignment ?? .left {
    case .center:
        xOffset = size.width / 2
    case .left:
        xOffset = 0
    case .right:
        xOffset = size.width
    default:
        fatalError("not supported!")
    }
    let rect = CGRect(origin: CGPoint(x: x - xOffset, y: y). size: size)
    attributedString.draw(in: rect)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69216656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档