问题标签 [quartz-graphics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2189 浏览

iphone - CG上下文优化

我有一个小的运行速度问题。在加载时,我生成了一个至少包含 1000 个点的 CGMutablePath。我想在屏幕上滚动这条路径,所以我使用这种代码:

问题是它有点慢,不是很慢,但是因为我需要添加更多的图形代码......我想知道设备是否正在绘制整个路径(一旦应用了比例,路径就是大约 10.000 像素宽),或者只是屏幕上可见的部分?我能做些什么来优化这个?

0 投票
1 回答
1071 浏览

iphone - Quartz缓存CGLayer

引用 CGLayer 文档:

Quartz 缓存任何被重用的对象,包括 CGLayer 对象。

我在大页面上遇到内存问题,我正在尝试实现一种简单的机制,根据它们是否在屏幕上/屏幕外来释放和重新创建视图。

为简单起见说,我有一堆 UIImages,作为网络请求的结果创建,保存在某个地方的数组中。我像这样创建一个 UIImageView :

imgView它离开屏幕时,它会被removedFromSuperview释放。好吗?不——存在于 Quartz 中的 CGLayer 没有被移除,因为anImage仍然存在。

我怎样才能解决这个问题?在这种情况下,唯一的方法是在 Quartz 的背后创建一个完全相同的图像,但指针地址不同,然后删除旧图像。而做到这一点的唯一方法是“深度复制”图像(UIImage 不实现 NSCoding)或通过网络再次请求它(慢)。

我在想的是,我需要将我的图像 sqllite 到数据库中,并在每次屏幕出现视图时重新获取它们——但我很想听听人们对此的想法。

0 投票
5 回答
11804 浏览

iphone - CALayer委托方法drawLayer没有被调用

我的对象 NSObject 的子类具有 CALayer 实例变量。我使用它来绘制和缓存内容,并将其委托设置为我的对象。

但由于某种原因,drawLayer:inContext:方法永远不会被调用。而actionForLayer:forKey:委托方法确实被调用,这意味着委托正在layer.delegate = self对象的 init 方法中正确设置。

关于阻止我的图层绘制方法drawLayer:inContext:被调用的任何建议?

我被称为[layer setNeedDisplay]经常。所以我想这是一些基本错误。

0 投票
2 回答
488 浏览

cocoa - 如何在 Cocoa 中实现非常大的滚动视图

在 Cocoa 中创建尺寸约为 15000 像素的视图是否明智?(当然,在 a 中一次只能看到该视图的一小部分NSScrollView

Interface Builder 的大小限制为 10000 像素。这是人为的限制还是背后有充分的理由?

我应该只创建巨大的视图并让NSScrollView/Quartz 担心有效地渲染它(我的视图是在请求的区域内以编程方式绘制的drawRect)还是冒着过度使用内存和其他问题的风险?(例如,OS X 是否可以随时尝试将整个视图的位图缓存到视频内存中?)

0 投票
2 回答
303 浏览

objective-c - NSString 会写多高和多宽?

我如何计算出绘制 NSString 的区域将占据多大的面积,即使用:

理想情况下,我需要在绘制之前解决这个问题,以便我可以将适当绘制字符串的“区域”隔开。

0 投票
4 回答
2509 浏览

cocoa - 如何在不从方法返回的情况下刷新核心图?

我有一个使用核心情节的可可界面。当我在界面中按下一个按钮时,会绘制一个图。我想通过多次调用绘图方法以及在两者之间调用 sleep() 来创建一系列图形。但似乎即使调用了重新加载数据,在函数退出之前什么也没有发生(也只显示最后一个图表)。现在我知道 CPAnimation 存在,但在我开始使用它之前,我想知道当函数退出时会发生什么导致图形刷新。我是否必须屈服于负责刷新而不是使用睡眠的线程?

0 投票
5 回答
17176 浏览

objective-c - 如何在 Mac OS X 中使用显示 ID 获取显示名称?

我想知道您是否可以帮助我弄清楚如何通过在 Mac OS X (10.5) 中使用显示器 ID号以编程方式获取显示器的显示名称?一个要求是,如果我为函数提供显示 ID,它将提供显示名称作为回报(反之亦然)。

显示名称看起来像这样:“彩色 LCD”、“SAMSUNG”

显示 ID 看起来像这样:“69671872”、“893830283”

Cocoa (Obj-C) 中的 NSScreen 或Quartz (C) 中的CGGetActiveDisplayList允许您获取显示器的显示 ID 号。两者似乎都没有获取显示名称的方法。不好了!下面是 NSScreen 获取显示 ID 的代码:

System ProfilerSystem Preferences下的Displays按显示名称而不是显示 ID 引用显示。

我在问,因为我想运行 AppleScript,它需要显示名称而不是显示 ID。任何帮助深表感谢!:)

0 投票
2 回答
5489 浏览

iphone - 带有 Quartz 2D 的简单 iPhone 绘图应用程序

我正在制作一个简单的 iPhone 绘图程序作为个人副项目。

我在子类 UIView 中捕获触摸事件并将实际内容渲染到单独的 CGLayer。每次渲染后,我调用 [self setNeedsLayout] 并在 drawRect: 方法中将 CGLayer 绘制到屏幕上下文。

这一切都很好,并且在绘制矩形时表现得很好。但是,我只想要一个简单的“手绘”模式,就像许多其他 iPhone 应用程序一样。

我想这样做的方法是创建一个 CGMutablePath,并且很简单:

但是,在绘制超过 1 秒后,性能会严重下降。

如果不是为了可变不透明度,我只会将每一行绘制到屏幕外的 CGLayer 中!小于 100% 的不透明度会导致屏幕上留下连接线条的点。我看过 CGContextSetBlendingMode() 但可惜我找不到答案。

谁能指出我正确的方向?其他 iPhone 应用程序能够以非常高的效率做到这一点。

0 投票
2 回答
999 浏览

iphone - iPhone Quartz CAAnimation 中的背景

每当我使用石英动画时,动画的背景都是白色的。我怎样才能将其更改为不同的颜色。这是我用来制作动画的代码

0 投票
1 回答
16905 浏览

iphone - 释放 CGImage (CGImageRef)

我很好奇我是否正在使用 CGImageRef 进行正确的内存管理,我正在通过几种方法(因为它是 CG 对象,我假设它不支持自动释放)。非 NSObjects 的内存管理以及与其他 NSObjects 的交互对我来说仍然有些新鲜。

这是我在做什么:

我正在使用 CGBitmapContextCreateImage(保留计数 1)在我的图像缓存管理器中创建 CGImageRef,并将其添加到 NSMutableDictionary(保留计数 2)。

当 CALayers 使用图像时,我使用 layer.contents(保留计数 +1)进行分配,并在删除图层之前使用 layer.contents = nil(保留计数 -1)清除内容。

最后,在清除纹理时,我调用 CGImageRefRelease 和 [NSMutableDictionary removeObject] 将保留计数设为 0。

这是这样做的正确方法吗?