所以,我的基本问题是:
iOS上是否有一种方法可以使用SVGKit来呈现包含对本地映像的引用的SVG?
血淋淋的细节
我的应用程序需要生成并呈现SVG (NSString中的XML)。XML将引用设备上的图像URL(在相机卷中)。我用SVGKit表示iOS。我可以使用以下内容(请参阅: PHAssets )从图像StackOverflow:nsurl-from-phasset获取URL:
+ (void) getUrlFromPHAsset:(PHAsset *)asset
completionHandler:(void (^)(NSURL *url)) handler {
PHImageRequestOptions *imgOptions = [PHImageRequestOptions new];
PHContentEditingInputRequestOptions *options =
[PHContentEditingInputRequestOptions new];
imgOptions.version = PHImageRequestOptionsVersionCurrent;
[asset requestContentEditingInputWithOptions:options
completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
handler(contentEditingInput.fullSizeImageURL);
}];
}然后,在生成的SVG字符串中使用该图像URL (这个URL是在模拟器中生成的):
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="2175px" height="1537px" viewBox="0 0 2175 1537" style="background-color:#ffffff">
<defs>
<clipPath id="my-uuid" clipPathUnits="userSpaceOnUse"> <rect x="1062" y="-1" width="1111" height="1538"/>
</clipPath>
</defs>
<g clip-path="url(#my-uuid)">
<image overflow="hidden" transform="translate(1062, -64.58393285371704) rotate(0, 555, 832)" x="0" y="0" width="1111" height="1665.167865707434" xlink:href="file:///Users/joe/Library/Developer/CoreSimulator/Devices/E8B8D888-93EC-4152-B0AD-B82D0C1B2FFE/data/Media/DCIM/100APPLE/IMG_0003.JPG"></image>
</g>
</svg>我试过的
我试图使用SVGKSourceString创建一个SVGKImage,但这会返回本地图像URL的空白图像(远程URL引用可以正常工作)。所谓“空白图像”,我指的是具有大小但没有图像内容的非零对象。
// DOESNT WORK on Simulator or real device
+ (SVGKImage *) svgImageFromString:(NSString *)text {
SVGKSource *source = [SVGKSourceString sourceFromContentsOfString:svgText];
SVGKImage *img = [SVGKImage imageWithSource:source]; // returns a blank image
}我在模拟器上注意到,如果我从设备上的一个文件中读取SVG内容,它就能工作。我觉得很奇怪,但是,随便吧。当它从文件中读取SVG内容时,它必须以不同的方式处理URL引用。因此,我将NSString转换为NSInputStream,然后使用SVGSourceLocalFile.initWithInputStream:创建SVGKSourceLocalFile,它也在模拟器上工作。SVG呈现中引用的本地图像。(注意:我必须用虚假的文件名设置filePath,以防止imageWithSource爆炸。)
但不幸的是,这在真正的设备上行不通。SVGKImage imageSource:带着一张空白的图片回来。
// WORKS ON THE SIMULATOR, not on a real device
+ (SVGKImage *) svgImageFromString:(NSString *)text {
NSData *svgData = [text dataUsingEncoding:NSUTF8StringEncoding];
NSInputStream *inp = [NSInputStream inputStreamWithData:svgData];
SVGKSourceLocalFile *fsource = [[SVGKSourceLocalFile alloc] initWithInputSteam:inp];
// hack: set filePath to prevent SVGKit from barfing
fsource.filePath = @"foo.bar";
return [SVGKImage imageWithSource:fsource];
}我强烈怀疑它不喜欢设备URL引用。我知道从PHAsset获取一个通用URL存在问题。模拟器上的URL在Safari模拟器中工作。但是我在真正的设备上得到的URL (看起来"file:///var/mobile/Media/DCIM/102APPLE/IMG_2405.JPG")在该设备的Safari应用程序上不起作用)。我还尝试将PHAsset转换为ALAssetURL。(参见StackOverflow:how-to-get-an-alasset-url-from-a-phasset ),但这也不起作用。它还返回一个空白图像。
版本细节
发布于 2016-10-13 14:15:37
SVGKit使用苹果自己的类来解析这些URL,并且不对它们进行额外的处理。
所以..。如果您得到的是零图像,那么您很可能破坏了NSURL自己的解析能力-- c.f。苹果的文档。
但是..。如果您运行Xcode调试器,在您使用的SVGKit SVGKSourceXXXXX类上设置一个断点,并在设备上运行,您应该能够实时地看到哪些失败以及在哪里--我猜是NSURL,但您可以确认这一点。
https://stackoverflow.com/questions/39841380
复制相似问题