- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 CoreGraphics 在 CGContext 中绘制单个字形和图元。以下代码适用于 XCode 9.2 中的 swift playground 当在 playground 中启动时,一个带有两倍字母 A 的小矩形应该出现在 playground liveView 的给定坐标处。
import Cocoa
import PlaygroundSupport
class MyView: NSView {
init(inFrame: CGRect) {
super.init(frame: inFrame)
}
required init?(coder decoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
// setup context properties
let context: CGContext = NSGraphicsContext.current!.cgContext
context.setStrokeColor(CGColor.black)
context.setTextDrawingMode(.fill)
context.setFillColor(CGColor(red: 0.99, green: 0.99, blue: 0.85, alpha: 1))
context.beginPath()
context.addRect(rect)
context.fillPath()
context.setFillColor(.black)
// prepare variables and constants
var font = CTFontCreateWithName("Helvetica" as CFString, 48, nil)
var glyph = CTFontGetGlyphWithName(font, "A" as CFString)
var glyph1Position = CGPoint(x: self.frame.minX, y: self.frame.maxY/2)
var glyph2Position = CGPoint(x: self.frame.minX+150, y: self.frame.maxY/2)
let text = "Hello"
var textOrigin = NSPoint(x: self.frame.minX+50, y: self.frame.maxY/2)
// draw one character
CTFontDrawGlyphs(font, &glyph, &glyph1Position, 1, context)
// *** *** when the next line is uncommented the bug appears *** ***
// text.draw(at: textOrigin)
CTFontDrawGlyphs(font, &glyph, &glyph2Position, 1, context)
}
}
var frameRect = CGRect(x: 0, y: 0, width: 200, height: 100)
PlaygroundPage.current.liveView = MyView(inFrame: frameRect)
现在我想在相同的上下文中绘制常规文本。但是,当通过自己的绘制方法在两个字形的绘制之间绘制文本字符串时,当前上下文似乎乱七八糟,第二个字形不会显示。在绘制两个单个字形后绘制文本时,一切都很好。
很明显绘制文本似乎对当前的 CGContext 有影响,但我无法找出到底发生了什么。我在绘制字符串之前尝试了 saveGstate() 方法并在之后恢复,但没有成功。
我还尝试使用 CoreText 方法通过 CTFramesetterCreateWithAttributedString 创建属性字符串并使用 CTFramesetterCreateFrame 显示它,它也不起作用,在创建框架 setter 之后,上下文变得困惑。
我的实际 playground 更复杂,字形并没有完全消失,而是显示在错误的垂直位置,但基本问题 - 问题是相同的:
如何在不在后台对上下文进行任何其他更改的情况下将文本绘制到 currentContext 中?
最佳答案
您需要设置文本矩阵(应用于文本绘制的转换)。您应该始终在绘制文本之前设置它,因为它不是图形状态的一部分,并且可能会被其他绘图代码(例如 AppKit 的字符串绘图扩展)破坏。
在调用 CTFontDrawGlyphs
之前添加以下内容:
context.textMatrix = .identity
这应该在上下文的初始设置中调用,因为在调用 drawRect
之前没有保证文本矩阵是相同的。然后,任何时候你调用了修改文本矩阵的东西,你都需要将它设置回你想要的东西(在这种情况下是身份,但如果你想以一种奇特的方式绘制它可能是其他东西)。
修改文本矩阵的内容并不总是显而易见的。 AppKit 绘图函数几乎总是如此(尽管我不知道有任何文档表明这一点)。修改上下文的 Core Text 函数,如 CTFrameDraw
和 CTLineDraw
,通常会用如下语句记录此事实:
This call can leave the context in any state and does not flush it after the draw operation.
同样 CTFontDrawGlyphs
警告:
This function modifies graphics state including font, text size, and text matrix if these attributes are specified in font. These attributes are not restored.
通常我不鼓励混合文本绘图系统。使用 AppKit 或 Core Text,但不要混用。如果您选择一个并坚持使用,那么这通常不是问题(只要您在 drawRect
的顶部初始化矩阵一次)。例如,如果您使用 CTFontDrawGlyphs
完成所有绘图,则不需要每次都重新设置矩阵;你会留在 Core Text 矩阵中并且它会很好(这就是为什么当你注释掉 draw(at:)
调用时它起作用的原因)。
关于swift text.draw 方法搞乱了 CGContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047093/
我在为 MKMapOverlayView 创建的 CGContext 中执行一些 CG 绘图操作。在我的上下文中绘制之后,我创建了一个图像并将其粘贴到 MapKit 提供的上下文中。 - (void)
我有一个 CGBitmapContext (bitmapContext),我想将它的一些矩形部分 (rect) 绘制到当前 CGContext (context) >). 现在我就是这样做的: CGC
各位,这是我的代码: - (void) renderPageAtIndex:(NSUInteger)index inContext:(CGContextRef)ctx { //backgrou
我正在使用代码在 CGContext 上显示 pdf 页面 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context {
在我的 iPhone 项目中,我有一个 UIView,我在其中实现了 drawRect 方法: - (void)drawRect:(CGRect)rect { CGContextRef con
我正在尝试在 UIView draw(_:) 中创建自己的 CGContext。这里: override func draw(_ rect: CGRect) { //let c
我正在UIView drawRect函数中绘制一个形状,该形状涉及剪切路径,然后在后面添加彩色块,以便颜色具有剪切路径的形状。但是,由于某些原因,路径的线条无法顺利伸出;如果抗锯齿功能无法正常使用,
我正在使用以下代码缩小UIImage: let image = UIImage(contentsOfFile: imageUrl.path!)!.CGImage let
我正在尝试使用 Core Graphics 从另一个线程在自定义 UIView 中进行无限绘图。无法获取当前的 CGContext,因此我尝试创建一个新的。但我不知道如何将其应用到 View 中。 这
在测试我的应用程序是否存在任何错误时,我注意到在模拟器中,当我调用其中一个函数将图像设置为 UIImageView 时,会抛出一堆 CGContext 错误,并且图像永远不会被设置。然而,在我的设备上
我有一个 UIView,它有 3 个自定义 subview ,其类(目前)称为 LVStemp 并表示树中的节点。 LVStemp 的框架比节点本身大,因为它还包含一些位于节点外部的绘图(尚未编码)。
据我所知,您可以使用两种方法在 CGContext 中绘制渐变,即 drawLinearGradient 和 drawRadialGradient。我正在寻找一种定义椭圆渐变的方法,我可以在其中定义
我正在尝试初始化 CGContext ( API ) let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirector
问题:如何在 CGContext 下显示背景图片? 我使用 Storyboard创建了一个 View Controller ,并放置了一个带有全屏背景图像的 View 。然后,使用相同的 View C
我正在尝试绘制以相等角度分隔的矩形。为此,我首先绘制一个 CGPath,然后对上下文应用转换。我连续做了5次。这是我的代码和输出。如您所见,屏幕截图中的输出不正确,矩形倾斜,不知道为什么。需要知道我做
我正在用 CGContext 渲染一个 NSAttributedString,但是当它渲染文本时是颠倒的 :( 这是我想出的: override func draw(with box: PDFDisp
我编写了一个渲染函数,每 1/60 秒调用一次。如下所示。本质上,它以使用正弦的放射状图案呈现 40 条线。看起来像这样http://imgur.com/a/kPKtT .当我在我的 iPhone 6
我有这段代码可以呈现一个内部带有动态文本的自定义滑动条 handle 。问题是我无法将其缩放到视网膜分辨率。它可以在所有设备上正确绘制并且大小合适,但在视网膜上分辨率较低。如何更改此代码以使最终图像分
当具有不同颜色的路径使用 CGContext 绘制在先前路径的顶部时,如何删除路径? 最佳答案 CGContextBeginPath() 在创建新路径的过程中总是丢弃之前的路径。 关于ios - CG
伙计们! 我需要绘制一些图像到 CGContext。这是相关代码: CGContextSaveGState(UIGraphicsGetCurrentContext()); CGContextRef c
我是一名优秀的程序员,十分优秀!