M. *_*yan 5 iphone objective-c uiscrollview uikit ios
我有一个扩展的 UIScrollView,它直接取自 Apple 文档示例项目“ZoomingPDFViewer”
如果你得到这个项目,你会注意到它的 UIScrollView 扩展类“PDFScrollView”在运行时有一个明显的错误(在 sim 和设备上)
如果您将缩放捏得足够远,您最终将达到故事板设置的缩放比例限制...但是,您可以重新捏捏并继续超出限制。
我一直在尝试在自己的项目中实现这个类,并且这个错误也随之而来。
由于某种原因,缩放结束后,UIScrollView 的 ZoomScale 属性被任意设置回 1.0,因此您可以有效地将缩放缩放到无穷大...请记住,重置的 ZoomScale 不会影响内容...所以您可以继续缩小,直到演示中的 PDF 只是屏幕上的一个像素。
我以前从未见过这种情况,并且以前做过大量的自定义 UIScrollView。
我已经尝试了几个步骤来解决它,但似乎没有任何效果。有谁知道什么会导致 UIScrollView 以这种方式重置其 ZoomScale ?
我认为这可能是因为在缩放期间子视图被删除和添加,但我在滚动视图中放置了一个虚拟视图来充当锚点,但这也不起作用。
就像我说的.. ZoomingPDFViewer 正是我正在使用的代码,使用 iOS 6.0
任何想法,将不胜感激。下面的示例代码
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
NSLog(@"Ending Zoom %0.2f %0.2f", [self zoomScale], scale);
// Set the new scale factor for the TiledPDFView.
_PDFScale *= scale;
// Calculate the new frame for the new TiledPDFView.
CGRect pageRect = CGPDFPageGetBoxRect(_PDFPage, kCGPDFMediaBox);
pageRect.size = CGSizeMake(pageRect.size.width*_PDFScale, pageRect.size.height*_PDFScale);
// Create a new TiledPDFView based on new frame and scaling.
TiledPDFView *tiledPDFView = [[TiledPDFView alloc] initWithFrame:pageRect scale:_PDFScale];
[tiledPDFView setPage:_PDFPage];
// Add the new TiledPDFView to the PDFScrollView.
[self addSubview:tiledPDFView];
self.tiledPDFView = tiledPDFView;
NSLog(@"End of end zoom %0.2f", [self zoomScale]);
}
Run Code Online (Sandbox Code Playgroud)
这是结束滚动委托...这两个日志都会生成一个 ZoomScale,这正是您所期望的...所以...除了 1.0 之外的任何数字,假设您实际缩放了。
然后调用layoutSubviews..
// Use layoutSubviews to center the PDF page in the view.
- (void)layoutSubviews
{
[super layoutSubviews];
// Center the image as it becomes smaller than the size of the screen.
CGSize boundsSize = self.bounds.size;
CGRect frameToCenter = self.tiledPDFView.frame;
// a bunch of code that sets frameToCenter
self.tiledPDFView.frame = frameToCenter;
self.backgroundImageView.frame = frameToCenter;
/*
To handle the interaction between CATiledLayer and high resolution screens, set the tiling view's contentScaleFactor to 1.0.
If this step were omitted, the content scale factor would be 2.0 on high resolution screens, which would cause the CATiledLayer to ask for tiles of the wrong scale.
*/
self.tiledPDFView.contentScaleFactor = 1.0;
NSLog(@"Subviews Layed Out %0.2f", [self zoomScale]);
}
Run Code Online (Sandbox Code Playgroud)
此时,无论如何,zoomScale 都会报告为 1.0...这会在 End Zoom 委托方法报告正确的缩放比例后追踪 0.003 秒。
这里的问题是,在苹果的示例代码中,他们返回一个要缩放的视图,因为- (UIView *)viewForZoomingInScrollView:该视图不断被重新实例化。不久之后,返回值是一个不同的对象,并且 UIScrollView 将此解释为缩放比例的重置,从而允许您滚动到无穷大。
我(还不知道)如何正确修复 Apple 的示例代码,但一个可行的解决方案是将 UIScrollView 固定到永远不会重置的虚拟视图,然后手动缩放其他所有内容。
| 归档时间: |
|
| 查看次数: |
6407 次 |
| 最近记录: |