我正在尝试使用Google Maps for iOS SDK最新版本1.2.1.2944来动画a GMSGroundOverlay.用户可以控制图像序列,因此使用动画UIImage不是一种可能的遗憾,所以我在动态加载UIImage.将GMSGroundOverlay.icon被设置为UIImage正在更新.
除了高内存使用情况,我似乎在已经达成的限制每当我试图覆盖一个UIImage使用GMSGroundOverlay.icon是超过1000像素X 1000像素,它崩溃.引用UIImage1000px x 1000px可以解决崩溃问题.
虽然我可能会利用CATiledLayer处理图像只加载到内存中,然后进入图标属性GMSGroundOverlay,但是有没有人有任何使用CATiledLayerGoogle Maps for iOS SDK和将图像排序为动画的经验GMSGroundOverlay?
我正在使用相当简单的代码在滚动视图中显示可缩放的PDF,并且它在iPad 2和原始iPad上运行得非常漂亮.但它在iPad 3上的速度非常缓慢.我知道我正在推动更多的像素,但渲染性能简直是不可接受的.
在iOS 5.0及更高版本中,tileSize属性被任意钳位在1024,这意味着在视网膜显示器上,瓷砖的大小只有一半.有没有人找到克服这种限制的方法?
否则,有没有人找到提高CATiledLayeriPad 3 速度的方法?
问候,
我正在开发一个受iOS SDK附带的"ZoomingPDFViewer"示例启发的应用程序.在某些时候,我发现了以下代码:
// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view's
// contentScaleFactor to 1.0. (If we omitted this, it would be 2.0
// on high resolution screens, which would cause the CATiledLayer
// to ask us for tiles of the wrong scales.)
pageContentView.contentScaleFactor = 1.0;
Run Code Online (Sandbox Code Playgroud)
我试图了解更多关于contentScaleFactor它的信息.在阅读了提到它的Apple文档的所有内容之后,我搜索了Google并且从未找到确切的答案.
以下是我很好奇的一些事情:
contentScaleFactor当绘制UIView的/ CALayer的内容时,似乎对图形上下文有某种影响.这似乎与高分辨率显示器(如Retina显示器)有关.contentScaleFactor真正有什么样的影响和什么?
当使用a UIScrollView并将其设置为缩放时,比方说,我的contentView ; contentView的所有子视图也正在缩放.这是如何运作的?哪些属性可以UIScrollView修改,甚至视频播放器变得模糊和扩大?
TL; DR:UIScrollView的缩放功能如何在"引擎盖下"工作?我想了解它是如何工作的,所以我可以编写正确的代码.
任何提示和解释都非常感谢!:)
我已经设置了一个用于Google Maps JavaScript API的磁贴源.我试图将其翻译为与iPhone MapKit一起使用.我已经正确地将javascript缩放级别实现到mapkit中.无论何时- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated调用,我都会根据相同的中心点将区域捕捉到最近的缩放级别.
是否可以使用CATiledLayer实现解决方案来实现切片解决方案.iPhone是否使用标准的256x256瓷砖,如谷歌地图本身?任何方向或帮助将非常感谢.如果不可能的话,我宁愿不浪费几个星期试图实现这个.
我正在生成一堆瓷砖CATiledLayer.在iPhone 4S上以4个级别的细节生成120个256 x 256的图块需要大约11秒钟.图像本身适合2048 x 2048.
我的瓶颈是UIImagePNGRepresentation.生成每256 x 256图像大约需要0.10-0.15秒.
我已经尝试在不同的背景队列上生成多个图块,但这只会将其减少到大约9-10秒.
我也尝试使用ImageIO框架,代码如下:
- (void)writeCGImage:(CGImageRef)image toURL:(NSURL*)url andOptions:(CFDictionaryRef) options
{
CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)@"public.png", 1, nil);
CGImageDestinationAddImage(myImageDest, image, options);
CGImageDestinationFinalize(myImageDest);
CFRelease(myImageDest);
}
Run Code Online (Sandbox Code Playgroud)
虽然这会产生较小的PNG文件(赢!),但它需要大约13秒,比以前多2秒.
有没有办法CGImage更快地编码PNG图像?也许使用NEON像libjpeg-turbo这样的ARM扩展(iPhone 3GS +)的库呢?
是否有比PNG更好的格式来保存不占用大量空间的瓷砖?
我能够提出的唯一可行选择是将磁贴大小增加到512 x 512.这会将编码时间减少一半.不知道那会对我的滚动视图做些什么.该应用适用于iPad 2+,仅支持iOS 6(使用iPhone 4S作为基线).
uiimage catiledlayer ios cgimageref uiimagepngrepresentation
在iPhone上(尽管我认为它在Cocoa中是一个同样有效的问题)我有一个围绕由CATiledLayer支持的UIView的UIScrollView.默认情况下,它的工作方式是在我的视口滚动到CATiledLayer的空白部分时加载任何未缓存/未获取的图块.
我想知道的是,是否有办法触发CATiledLayer加载未主动显示的磁贴?例如,我想在当前显示的图块仍然在屏幕外时预加载与当前显示的图块相邻的所有图块,从而避免在异步加载图像时闪烁的空白屏幕闪烁.
有任何想法吗?
所有,
我无法从CATiledLayer获得我想要的行为.有没有一种方法可以触发瓷砖重绘而不会产生副作用,即它们的区域首先被清除为白色?我已经将CATiledLayer子类化,将fadeDuration设置为0.
更具体地说,这里是我所看到的以及我正在努力实现的细节:
谢谢; 我很感激你的想法.
更新:
只是为了跟进 - 我意识到在重绘之前瓷砖没有被清理成白色,它们被完全取出; 我看到的白色是我的CATiledLayer支持的视图下面的视图的颜色.
作为快速入侵/修复,我在UIScrollView下面放置了一个UIImageView,在触发重新绘制CATiledLayer支持的视图之前,我将其可见部分呈现到UIImageView中并让它显示出来.这显着平滑了重绘.
如果有人有更好的解决方案,比如在重新绘制之前保持重绘目标的瓷砖不会消失,我仍然喜欢听到它.
在我的应用程序中,我试图沿着路径渲染文本; 这对大多数人物来说都没问题,但对于日语(或任何非mac-Roman)都没有.我被建议使用[NSString drawAtPoint],它在我的CATiledLayer中显示正确的字符; 然而,它们在大约5秒后消失.在这个时候我可以缩放图层并且它们可以正确缩放,但它们似乎没有像文本的其他部分那样被提交到CATiledLayer.
在渲染之前,我检查字符串并确定它们中的任何一个是否都不可渲染.如果我有问题,我会改用drawAtpoint:
if (!isFullyDisplayable)
{
CGContextShowGlyphsAtPoint(context, pt.x, pt.y, realGlyph, 1);
}
else {
// fall back on less flexible font rendering for difficult characters
NSString *b = [gv text];
NSString *c = [b substringWithRange:NSMakeRange(j,1)];
[c drawAtPoint:pt withFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]];
}
Run Code Online (Sandbox Code Playgroud)
有没有人有关于为什么文本消失的指示?
一旦使用drawAtPoint,我的调试输出就会充满:
<Error>: CGContextGetShouldSmoothFonts: invalid context
<Error>: CGContextSetFont: invalid context
<Error>: CGContextSetTextMatrix: invalid context
<Error>: CGContextSetFontSize: invalid context
<Error>: CGContextSetTextPosition: invalid context
<Error>: CGContextShowGlyphsWithAdvances: invalid context
Run Code Online (Sandbox Code Playgroud)
所以我猜测它与我的上下文管理有关,但我认为如果这与我使用CGContextShowGlyphsAtPoint在同一个地方它应该有正确的上下文?
我希望也许这只是模拟器的一个问题,但当然它让我担心,因为我已经提交了我的视网膜应用程序,直到16日才能测试它.
我在我的应用程序中实现了CATiledLayer来查看非常大的地图.地图的图块来自互联网,但它们也会被缓存,因此,通常它们实际上是直接从设备加载的.
在iPad 1和iPad2上,它的工作非常漂亮.您只能注意到iPad 2上呈现的图块,即使它们来自互联网也是如此.
在iPad模拟器上它工作得很漂亮.
我的问题是iPad视网膜模拟器.在视觉上,它看起来没问题.地图的大小正确,并与我用来显示数据叠加层的另一个图层对齐,但是它会慢慢加载.大部分时间我尝试了一次,直到我开始滚动它不会加载任何瓷砖的话,那么当它被装载瓷砖它在做什么,也许1每秒看起来很可怕.
我没有在视网膜上运行的代码比标准分辨率屏幕不同,所以我希望这只是模拟器的问题......但我仍然担心.
有没有其他人在自己的应用程序中看到过这个
执行摘要:
有时UIScrollView会对值进行不必要的更改contentOffset,从而导致应用程序在正在查看的文档中显示错误的位置.不必要的更改与滚动视图的动画更改一起发生zoomScale.
详细信息:
与缩小,当我遇到问题CATiledLayer的UIScrollView.该CATiledLayer持有PDF,并在contentOffset一定范围内,当我缩小,将contentOffset被改变(这是BUG)变焦发生之前.在contentOffset似乎在苹果的代码被改变.
为了说明这个问题,我修改了Apple的示例应用程序ZoomingPDFViewer.代码在github上:https://github.com/DirkMaas/ZoomingPDFViewer-bug
点按将导致zoomScale更改为0.5,使用animateWithDuration,因此缩小.如果UIScrollView's contentOffset.y小于约2700或大于5900,则zoomScale动画效果正常.如果contentOffset.y在这两个值之间发生点击,contentOffset.y则会跳转(不动画)到约2700,然后zoomScale动画将发生,但同时会发生滚动,因此当动画完成时,contentOffset.y就是它的位置应该.但跳跃从何而来?
例如,说contentOffset.y屏幕被点击时是2000:zoomScale动画效果很好; contentOffset.y没有改变.
但是如果在contentOffset.y点击屏幕时为4000,那么contentOffset.y将在没有动画的情况下跳转到大约2700,然后缩放和滚动将从该点开始并同时发生.当动画完成时,看起来好像我们从4000直接缩放,所以我们最终在正确的位置,但行为是错误的.
关于用户界面的说明:
zoomScale设置为0.5; 变化是动画的我注意到如果zoomScale大于0.5,那么跳跃不会那么大.此外,如果我使用setZoomScale:animated:而不是animateWithDuration,错误消失,但我不能使用它,因为我需要链接动画.
以下是我所做的总结(github中的代码包含这些更改):
catiledlayer ×10
ios ×5
iphone ×5
ipad ×2
uiscrollview ×2
cgcontext ×1
cgimageref ×1
cocoa ×1
cocoa-touch ×1
crash ×1
ios4 ×1
mapkit ×1
mkmapview ×1
objective-c ×1
overlay ×1
pdf ×1
uiimage ×1
uiview ×1