だから、私の基本的な質問は次のとおりです。
iOS で SVGKit を使用して、ローカル イメージへの参照を含む SVG をレンダリングする方法はありますか?血まみれの詳細
私のアプリケーションは、SVG (NSString 内の XML) を生成してレンダリングする必要があります。XML は、デバイス (カメラ ロール内) の画像 URL を参照します。iOS用のSVGKitを使用しています。以下を使用してイメージ PHAssets から URL を取得できます (参照: StackOverflow:nsurl-from-phasset ):
+ (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 XML 文字列でその画像 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 参照は正常に機能します) 。「空白の画像」とは、サイズはあるが画像の内容がない nil 以外のオブジェクトを意味します。
// 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 で参照されるローカル イメージ。(注:imageWithSourceが爆発するのを防ぐために、filePathに偽のファイル名を設定する必要がありました。)
しかし、残念ながら、これは実際のデバイスでは機能しませんでした。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 を参照)が、これもうまくいきませんでした。これも空白の画像を返します。
バージョンの詳細
- iOS バージョン: 10.0.2 (実機)、sim 上のさまざまなバージョン (8.4、9.3、10.0)
- SVGKit バージョン: pod 'SVGKit', :git => ' https://github.com/SVGKit/SVGKit.git ', :branch => '2.x'