- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个扩展的 UIScrollView,它直接取自 Apple 文档示例项目“ZoomingPDFViewer”
如果你得到这个项目,你会注意到它的 UIScrollView 扩展类“PDFScrollView”在你运行它时有一个明显的错误(在 sim 和设备上)
如果您将缩放缩放得足够远,您最终会达到 StoryBoard 设置的缩放比例限制...但是随后,您可以重新缩放并继续超过限制。
我一直在尝试在自己的项目中实现这个类,而这个错误也随之而来。
出于某种原因,在缩放结束后,UIScrollView 的 zoomScale 属性被任意设置回 1.0,因此您可以有效地将缩放缩放到无限远...请记住,重置的 zoomScale 不会影响内容。 .. 所以您可以继续缩小,直到演示中的 PDF 只是屏幕上的一个像素。
我以前从未见过这个,我以前做过很多自定义 UIScrollView。
我已经尝试了几个步骤来解决它,但似乎没有任何效果。有谁知道什么会导致 UIScrollView 以这种方式重置其 zoomScale?
我认为这可能是因为在缩放期间删除和添加了 subview ,但我在 ScrollView 中放置了一个虚拟 View 作为 anchor ,但也没有用。
就像我说的.. 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]);
}
这是结束滚动委托(delegate)...这两个日志都会产生一个 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]);
}
此时,无论发生什么情况,zoomScale 都会报告回 1.0...这会在 End Zoom 委托(delegate)方法报告正确的缩放比例后跟踪 0.003 秒。
最佳答案
是的,这发生在 iOS 3 左右。zoomScale
始终相对于 ScrollView 的当前状态,而不是全局测量。每次缩放后,需要重新计算相对于当前整体缩放比例的最小和最大缩放比例。
这是我过去使用过的一些代码。它应该为您提供流程的要点:
尽早获取您需要的值:
- (void) viewDidLoad
{
[super viewDidLoad];
...
// Squirrel away min and max zoom values from nib
sMinZoomScale = self.scrollView.minimumZoomScale; // the very minimum
sMaxZoomScale = self.scrollView.maximumZoomScale; // the very maximum
sGlobalZoomScale = 1.0f; // we're currently at 100% size
...
}
然后是其余部分(self.navigationView
是 scrollView 的内容 View ):
- (void) scrollViewDidEndZooming:(UIScrollView *)scrollView
withView:(UIView *)view
atScale:(CGFloat)scale
{
// after a zoom, change the resolution of our map
sGlobalZoomScale *= scale;
// Peg the scale to minZoom and maxZoom, in case of rounding errors
sGlobalZoomScale = MIN(MAX(sMinZoomScale, sGlobalZoomScale), sMaxZoomScale);
self.navigationView.globalZoomScale = sGlobalZoomScale;
self.navigationView.globalScaleTransform = self.globalScaleTransform;
[self updateResolution];
// throw out all tiles so they'll reload at the new resolution
[self.navigationView setNeedsDisplay];
}
// By the time we get here, the scrollview's applied a fake scale and translate transform, and
// altered the scrollview's zoom scale. BUT, the navigationview is as it ever was.
- (void) updateResolution
{
CGFloat zoomScale = [self.scrollView zoomScale];
CGSize oldContentViewSize = self.navigationView.frame.size;
// zooming properly resets contentsize as it happens.
CGSize newContentSize = self.scrollView.contentSize;
CGPoint newContentOffset = self.scrollView.contentOffset;
CGFloat xMult = newContentSize.width / oldContentViewSize.width;
CGFloat yMult = newContentSize.height / oldContentViewSize.height;
newContentOffset.x *= xMult;
newContentOffset.y *= yMult;
CGFloat currentMinZoom = self.scrollView.minimumZoomScale;
CGFloat currentMaxZoom = self.scrollView.maximumZoomScale;
CGFloat newMinZoom = currentMinZoom / zoomScale;
CGFloat newMaxZoom = currentMaxZoom / zoomScale;
// Reset zoom scales temporarily so we can patch up the revised content view
// don't call our own set..zoomScale, 'cause they eventually call this method. Infinite recursion is uncool.
[self.scrollView setMinimumZoomScale:1.0f];
[self.scrollView setMaximumZoomScale:1.0f];
[self.scrollView setZoomScale:1.0f animated:NO];
[self.navigationView setFrame:CGRectMake(0.0f, 0.0f, newContentSize.width, newContentSize.height)];
[self.scrollView setContentSize:newContentSize];
[self.scrollView setContentOffset:newContentOffset animated:NO];
[self.scrollView setMinimumZoomScale:newMinZoom];
[self.scrollView setMaximumZoomScale:newMaxZoom];
}
希望这对您有所帮助。
关于iphone - 为什么 UIScrollView 会自动重置其 zoomScale 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642776/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!