最近有很多关于绘制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功能:
我想知道是否有一种方法可以将我的视图转换为类似iPhone文件夹的方式.换句话说,我希望我的视图在中间的某处分开,并在其下方显示一个视图.这可能吗?

编辑: 根据下面的建议,我可以通过这样做截取我的应用程序:
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)
但是,不知道该怎么做.
编辑:2 我已经想出如何在我的视图中添加一些阴影,这是我已经实现的(裁剪以显示相关部分):

编辑:3
什么是最好的方法来调查服务器为http web请求返回403的原因?
可以配置iis服务器为403 提供更详细的内部日志吗?
如果要定位iOS 4,则可以使用Data Protection API.
如果您有"完全"保护,这会加密整个沙箱吗?
具体来说,如果我下载了以编程方式将.doc文件说成磁盘会加密吗?或者,如果我使用NSData数据保护选项,它是否只加密?
如果您曾经问过如何在objective-c中调试发布/分配问题,您将遇到这些可以帮助跟踪问题的环境设置:
NSZombieEnabled - 发布后保持不变,所以你可以获得指针等.MallocStackLogging - 保留对象历史记录以供日后参考 NSDebugEnabled您可以将所有这些设置YES为"可执行文件"(在组树中找到)信息中"参数"选项卡的"环境"部分.
所以,我得到这个控制台输出
MyApp [ 4413:40b] - [CALayer retainCount]:发送到解除分配的实例0x4dbb170的消息
然后打开终端,而调试器转发了break并输入:
malloc_history 4413 0x4dbb170
然后,我得到一个大文本转储,据我所知,重要的是这个:
1
ALLOC 0x4dbb160-0x4dbb171 [size=18]:
thread_a0375540 |start | main |
UIApplicationMain | GSEventRun |
GSEventRunModal | CFRunLoopRunInMode |
CFRunLoopRunSpecific | __CFRunLoopRun
| __CFRunLoopDoTimer |
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
| __NSFireDelayedPerform |
-[todoListViewController drillDocumentMenu:] |
-[documentListViewController drillIntoDocumentWithToDoRecord:] |
-[documentViewController OpenTodoDocument:OfType:WithPath:] |
-[documentViewController OpenDocumentOfType:WithPath:] |
-[documentViewController managePDFDocumentWithPath:] |
-[PDFDocument loadPDFDocumentWithPath:andTitle:] |
-[PDFDocument getMetaData] | CGPDFDictionaryApplyFunction |
ListDictionaryObjects(char const*,
CGPDFObject*, void*) …Run Code Online (Sandbox Code Playgroud) 我有一个UIScrollView内容大小足以容纳一些小的UIScrollViews用于缩放viewForZoomingInScrollView的分页,这是一个viewController,它包含一个用于绘制PDF页面的CALayer.这使我能够像ibooks PDF阅读器一样浏览PDF.
绘制PDF(平铺图层)的代码位于:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
Run Code Online (Sandbox Code Playgroud)
只需在可见屏幕上添加"页面"即可自动调用此方法.当我更改页面时,在绘制所有图块之前会有一些延迟,即使已经创建了对象(页面).
我想要做的是在用户滚动到它之前渲染下一页,从而防止可见的平铺效果.但是,我发现如果图层位于屏幕外,将其添加到scrollview中则不会调用drawLayer.
这里有什么想法/常见问题吗?
我试过了:
[viewController.view.layer setNeedsLayout];
[viewController.view.layer setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)
注意:这是在功能上复制ibooks的事实在完整应用程序的上下文中是无关紧要的.
在IB中,我有一个带有自定义类型的UIButton的视图,它没有图像,标题被设置为"#placeholder"
视图附加到提供按钮IBOutlet和IBAction按钮的类.
我用这个设置按钮标题:ViewClass.ButtonOutlet.titleLabel.text = @"%@",stringifiedVariable;每当我需要时.
这没问题.但是,当我单击按钮时,titleLabel.text将恢复为"#placeholder".
我尝试在检查器的"绘图"部分(属性选项卡)中取消选中"突出显示的调整图像",但行为仍然相同.
可以防止这种变化吗?还是有更好的模式,我应该使用?
以编程方式在app中创建tabBar非常简单:
self.tabBarController = [[UITabBarController alloc] init];
[self.view addSubview:_tabBarController.view];
UIViewController * tab1 = [[UIViewController alloc] init];
tab1.title = "A";
UIViewController * tab2 = [[UIViewController alloc] init];
tab2.title = "B";
_tabBarController.viewControllers = [NSArray arrayWithObjects:patientSearch,todoList,nil];
[tab1 release];
[tab2 release];
Run Code Online (Sandbox Code Playgroud)
您还可以轻松地将图像放入选项卡中:
tab1.tabBarItem.image = [UIImage imageNamed:@"myIcon.png"];
Run Code Online (Sandbox Code Playgroud)
但是,如何将这些选项卡的图像设置为系统图像?(例如,搜索,收藏,书签等)在IB中,这是通过更改"标识符"来设置的,但是如何以编程方式执行此操作
我的启动画面工作正常,但我的应用程序在横向模式下工作,并且启动画面以默认纵向模式显示.
如何启动应用程序以使启动屏幕在我的应用程序之间的横向模式之间旋转?
我正在使用以下代码:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
interfaceOrientation == UIInterfaceOrientationLandscapeRight)
return YES;
else {
return NO; }
}
Run Code Online (Sandbox Code Playgroud)
而对于闪屏
-(void)displayScreen {
UIViewController *displayViewController=[[UIViewController alloc] init];
displayViewController.view = displaySplashScreen;
[self presentModalViewController:displayViewController animated:NO];
[self performSelector:@selector(removeScreen) withObject:nil afterDelay:3.0];
}
-(void)removeScreen
{ [[self modalViewController] dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
但是如何将旋转放在显示屏内?
参考下面的代码,一旦一个块被放入一个数组,你如何获取该块对象并运行该块中的实际代码.
另一个问题:如果我在下面的块中调用方法,该块是否封装了该方法中的代码或捕获方法的签名并以这种方式调用它?
-(void)blockCalledMethod
{
NSLog(@"Hello World");
}
-(void)programStart
{
NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];
id pointerToBlock = [array lastObject];
}
Run Code Online (Sandbox Code Playgroud) cocoa-touch ×6
objective-c ×6
ios ×5
ipad ×5
iphone ×4
calayer ×2
autorotate ×1
directory ×1
iis ×1
logging ×1
pdf ×1
transform ×1
uiscrollview ×1