- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我是 iOS API 这些部分的新手,这里有一些问题在我脑海中造成无限循环
为什么 ..BeginImageContext 有大小而 ..GetCurrentContext 没有大小?如果 ..GetCurrentContext 没有大小,它在哪里绘制?界限是什么?
为什么他们必须有两个上下文,一个用于图像,一个用于一般图形?图像上下文不是已经是图形上下文了吗?分别的原因是什么(我是想知道我不知道的)
最佳答案
UIGraphicsGetCurrentContext()
返回对当前图形上下文的引用。它不会创建一个。记住这一点很重要,因为如果您从这个角度来看它,您会发现它不需要大小参数,因为当前上下文就是创建图形上下文时使用的大小。
UIGraphicsBeginImageContext(aSize)
用于在 UIView 的 drawRect:
方法之外的 UIKit 级别创建图形上下文。
这里是您将使用它们的地方。
如果你有一个 UIView 的子类,你可以像这样覆盖它的 drawRect: 方法:
- (void)drawRect:(CGRect)rect
{
//the graphics context was created for you by UIView
//you can now perform your custom drawing below
//this gets you the current graphic context
CGContextRef ctx = UIGraphicsGetCurrentContext();
//set the fill color to blue
CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
//fill your custom view with a blue rect
CGContextFillRect(ctx, rect);
}
在这种情况下,您不需要创建图形上下文。它是自动为您创建的,并允许您在 drawRect: 方法中执行自定义绘图。
现在,在另一种情况下,您可能希望在 drawRect: 方法之外执行一些自定义绘图。在这里您将使用 UIGraphicsBeginImageContext(aSize)
你可以这样做:
UIBezierPath *circle = [UIBezierPath
bezierPathWithOvalInRect:CGRectMake(0, 0, 200, 200)];
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
//this gets the graphic context
CGContextRef context = UIGraphicsGetCurrentContext();
//you can stroke and/or fill
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor lightGrayColor].CGColor);
[circle fill];
[circle stroke];
//now get the image from the context
UIImage *bezierImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *bezierImageView = [[UIImageView alloc]initWithImage:bezierImage];
我希望这有助于为您解决问题。此外,您应该使用 UIGraphicsBeginImageContextWithOptions(size, opaque, scale)。有关使用图形上下文自定义绘图的进一步说明,请参阅我的回答 here
关于ios - UIGraphicsGetCurrentContext 与 UIGraphicsBeginImageContext/UIGraphicsEndImageContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785254/
我正在我的应用程序中截取屏幕截图。我可以截图。 现在我想通过指定 x 和 y 坐标来截取屏幕截图。这可能吗? UIGraphicsBeginImageContext( self.view.bounds
我正在使用这种方法来压缩UIImage if (actualHeight > maxHeight || actualWidth > maxWidth) { if(imgRati
所以我一直认为 UIGraphicsBeginImageContext 是线程安全的,可以从任何线程调用以创建可用于绘制的新 CGContextRef。 但是,当前documentation指出 “您
我现在正在为 Mac OSX 创建一个 iOS 应用程序。我有下面的代码将图像转换为 1024 的大小,并根据图像的纵横比计算出宽度。这适用于 iOS,但显然不适用于 OSX。我不确定如何创建 NSI
我正在尝试附加从 UIGraphicsBeginImageContext 渲染的图像。作为测试,我也将图像添加到相册中。这一切在模拟器上都能完美运行,但在设备上,正确的图像会添加到相册中,但不会正确显
我想经常在我的 View 中画线,但它不起作用。我不想使用drawRect,因为我还必须维护之前绘制的线的状态。下面是画线的代码。请指导。 - (void)drawPathWithPoints:(in
所以我一直认为 UIGraphicsBeginImageContext 是线程安全的,可以从任何线程调用以创建可用于绘制的新 CGContextRef。 但是,当前documentation指出 “您
我想在图像中捕获当前屏幕。我这样做: UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.isOpaque,
我正在尝试生成图像,并在 Apple 文档中发现 UIGraphicsBeginImageContext() 看起来很完美。我一直在看一些 Quartz 教程,在每个教程中,他们都使用自定义 View
我有代码可以让我在 UIImageView 上绘图 - 但我希望能够限制绘图区域。 我已经能够限制大小,但现在我无法定位它:如果我将 (0, 0) 更改为任何其他值,我的图像将完全消失并且绘图功能将停
我尝试一次对超过 100 个 UIimage 进行图像裁剪和羽化。但是在iPhone6上运行时总是会出现内存问题。 Memory Leak checking by Instrucment 这是代码。我
我有一个简单的函数来创建一个特殊尺寸的 UIImage : - (UIImage*)imageWithSize:(CGSize) imSize { UIGraphicsBeginImageCo
我正在尝试在后台线程中更改图像的颜色。 Apple 文档说 UIGraphicsBeginImageContext 只能从主线程调用,我正在尝试使用 CGBitmapContextCreate: co
我在执行下面的代码时遇到了这些错误: [Switching to process 74682 thread 0x2003] [Switching to process 74682 thread 0x2
我正在用 UIGraphicsImageRendererFormat 替换 UIGraphicsBeginImageContext 以优化性能并使我的代码现代化。出于某种原因,UIGraphicsIm
在我的代码中,我将图像的大小拉伸(stretch)到指定的大小。到目前为止,代码工作正常。我遇到的问题是“UIGraphicsBeginImageContext ()”没有释放新图像的内存。因此,大约
我读过一些推荐使用的帖子: UIGraphicsBeginImageContextWithOptions((image.size), NO, 0.0f) 代替: UIGraphicsBeginImag
我是 iOS API 这些部分的新手,这里有一些问题在我脑海中造成无限循环 为什么 ..BeginImageContext 有大小而 ..GetCurrentContext 没有大小?如果 ..Get
我想在 UIImage 上画一些线。我能够将线条绘制到上下文中,最后我在使用以下代码从上下文中获取图像之前绘制背景图像: UIGraphicsBeginImageContext(self.bounds
我正在使用 UIGraphicsBeginImageContext 捕获屏幕,但图像质量不佳。任何人都可以帮助我如何将 UICollectionViewCell 保存为高质量图像以及如何在选择单元格时
我是一名优秀的程序员,十分优秀!