最近有很多关于绘制PDF的问题.
是的,你可以很容易地使用a来渲染PDF,UIWebView但这不能提供你期望从一个好的PDF查看器中获得的性能和功能.
您可以将PDF页面绘制到CALayer或UIImage.Apple甚至有示例代码来展示如何在Zoomable UIScrollview中绘制大型PDF
但同样的问题不断出现.
UIImage方法:
UIImage不是光学尺度,也不是图层方法.UIImages从PDFcontext
限制/防止使用它来创建一个实时渲染的新的缩放的水平.CATiledLayer方法:
CALayer:可以看到单个图块渲染(即使使用tileSize调整)CALayers 不能提前准备(在屏幕外呈现).一般来说,PDF查看器的内存也很重要.甚至监视苹果可缩放PDF示例的内存使用情况.
在我目前的项目中,我正在开发一个PDF查看器,并UIImage在一个单独的线程中呈现一个页面(这里也是问题!)并在比例为x1时呈现它.CATiledLayer一旦比例> 1,渲染就会开始.iBooks采用了类似的双重拍摄方法,就好像你滚动页面一样,你可以看到页面的低分辨率版本只有不到一秒钟,然后出现一个清晰的版本.
我在页面的每一侧渲染2页焦点,以便PDF图像准备好在它开始绘制之前掩盖图层.当页面离焦点页面+2页时,它们会被再次销毁.
有没有人有任何见解,无论多么小或明显改善Drawing PDF的性能/内存处理?或者这里讨论的任何其他问题?
编辑:一些提示(信用 - 卢克麦克尼斯,VdesmedT,马特加拉格尔,约翰):
尽可能将所有媒体保存到磁盘.
如果在TiledLayers上渲染,请使用更大的tileSizes
init经常使用带占位符对象的数组,另外另一种设计方法就是这个
请注意,图像渲染速度比a快 CGPDFPageRef
使用NSOperations或GCD和块提前准备页面.
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);之前调用CGContextDrawPDFPage以减少绘制时的内存使用量
使用docRef初始化你NSOperations是个坏主意(内存),将docRef包装成单例.
取消不必要NSOperations当你可以,特别是如果他们将使用记忆,但要小心打开上下文!
回收页面对象并销毁未使用的视图
一旦您不需要它们,请立即关闭所有打开的上下文
接收内存警告释放并重新加载DocRef和任何页面缓存
其他PDF功能:
我想在UIView上执行透视变换(例如在coverflow中看到)
有谁知道这是否可能?
我已经调查过使用CALayer并且已经完成了所有实用的程序员Core Animation播客,但我仍然不清楚如何在iPhone上创建这种转换.
任何帮助,指针或示例代码片段将非常感谢!
注意:自问这个问题以来,事情已经发生了变化; 请看这里有一个很好的近期概述.
在自动布局之前,您可以通过存储框架,设置锚点和恢复框架来更改视图图层的锚点,而无需移动视图.
在自动布局世界中,我们不再设置框架,但是约束似乎不能将视图的位置调整回我们想要的位置.您可以破解约束以重新定位视图,但在轮换或其他调整大小事件时,这些会再次变为无效.
以下明智的想法不起作用,因为它创建了"无效的布局属性配对(左侧和宽度)":
layerView.layer.anchorPoint = CGPointMake(1.0, 0.5);
// Some other size-related constraints here which all work fine...
[self.view addConstraint:
[NSLayoutConstraint constraintWithItem:layerView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:layerView
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:20.0]];
Run Code Online (Sandbox Code Playgroud)
在这里我的目的是左边缘设置layerView,调整后的定位点来看,它的宽度加上20(我从上海华盈的左边缘要插入的距离)的一半.
是否可以在使用自动布局布局的视图中更改定位点而不更改视图的位置?我是否需要使用硬编码值并在每次旋转时编辑约束?我希望不是.
我需要更改锚点,以便在将变换应用于视图时,我获得正确的视觉效果.
我的-drawInContext:方法中有一个包含一些复杂绘图代码的图层.我正在尝试最小化我需要做的绘图量,所以我使用-setNeedsDisplayInRect:仅更新已更改的部分.这是非常好的工作.但是,当图形系统更新我的图层时,它会使用交叉淡入淡出从旧图像过渡到新图像.我希望它能立即切换.
我已经尝试使用CATransaction来关闭操作并将持续时间设置为零,并且都不起作用.这是我正在使用的代码:
[CATransaction begin];
[CATransaction setDisableActions: YES];
[self setNeedsDisplayInRect: rect];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
我应该使用不同的CATransaction方法(我也尝试过-setValue:forKey:使用kCATransactionDisableActions,结果相同).
我正在旋转CALayer,并在动画完成后尝试将其停在最终位置.
但是在动画完成后,它会重置到其初始位置.
(xcode docs明确表示动画不会更新属性的值.)
任何建议如何实现这一目标.
在我的应用程序中 - 有四个按钮,命名如下:
按钮上方有一个图像视图(或UIView).
现在,假设用户点击 - 左上角按钮.上面的图像/视图应该在该特定角落四舍五入.
我在为UIView应用圆角方面遇到了一些困难.
现在我使用以下代码将圆角应用于每个视图:
// imgVUserImg is a image view on IB.
imgVUserImg.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"any Url Here"];
CALayer *l = [imgVUserImg layer];
[l setMasksToBounds:YES];
[l setCornerRadius:5.0];
[l setBorderWidth:2.0];
[l setBorderColor:[[UIColor darkGrayColor] CGColor]];
Run Code Online (Sandbox Code Playgroud)
上面的代码将圆度应用于所提供视图的每个角.相反,我只想将圆度应用于选定的角落,如 - 顶部/顶部+左侧/底部+右侧等.
可能吗?怎么样?
我正在将一个代码块从iOS4项目移植到iOS5,我遇到了一些ARC问题.该代码从屏幕截图生成PDF.
PDF生成代码
UIView *captureView;
...
NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData(pdfData, captureView.bounds, nil);
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
[captureView.layer renderInContext:pdfContext];
UIGraphicsEndPDFContext();Run Code Online (Sandbox Code Playgroud)
renderInContext行
[captureView.layer renderInContext:pdfContext];Run Code Online (Sandbox Code Playgroud)
生成以下错误.
Automatic Reference Counting issue
Receiver type 'CALayer' for instance message is a forward declarationRun Code Online (Sandbox Code Playgroud)
有什么想法在这里发生了什么?
core-animation objective-c calayer ios automatic-ref-counting
我有一个简单的视图(图片的左侧),我需要创建一些覆盖(图片的右侧)到这个视图.这个叠加应该有一些不透明度,所以下面的视图仍然是部分可见的.最重要的是,这个叠加层应该在它的中间有一个圆孔,所以它不会覆盖视图的中心(见下图).
我可以轻松创建一个这样的圆圈:
int radius = 20; //whatever
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0,radius,radius) cornerRadius:radius].CGPath;
circle.position = CGPointMake(CGRectGetMidX(view.frame)-radius,
CGRectGetMidY(view.frame)-radius);
circle.fillColor = [UIColor clearColor].CGColor;
Run Code Online (Sandbox Code Playgroud)
像这样的"完整"矩形覆盖:
CAShapeLayer *shadow = [CAShapeLayer layer];
shadow.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) cornerRadius:0].CGPath;
shadow.position = CGPointMake(0, 0);
shadow.fillColor = [UIColor grayColor].CGColor;
shadow.lineWidth = 0;
shadow.opacity = 0.5;
[view.layer addSublayer:shadow];
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将这两个层组合在一起,以便创建我想要的效果.任何人?我已经尝试了所有的东西......非常感谢你的帮助!

两者都具有大多数相同的属性,都支持不同类型的动画,两者都代表不同的数据.UIView和CALayer有什么区别?
我有一个在其图层中添加了UIView大约8个不同的CALayer子图层.如果我修改视图的边界(动画),那么视图本身会缩小(我用a检查过backgroundColor),但是子图层的大小保持不变.
怎么解决这个?
calayer ×10
ios ×9
iphone ×4
objective-c ×4
uiview ×4
autolayout ×1
cocoa-touch ×1
pdf ×1
quartz-core ×1
uikit ×1
xcode ×1