SVGKit: Как отобразить XML-строку SVG, которая ссылается на фотографию устройства iOS, используя SVGKit
Итак, мой основной вопрос:
Есть ли способ на iOS использовать SVGKit для рендеринга SVG, который содержит ссылки на локальные изображения?Гори Подробнее
Мое приложение должно генерировать и визуализировать SVG (XML в NSString). XML будет ссылаться на URL-адреса изображений на устройстве (в Camera Roll). Я использую SVGKit для iOS. Я могу получить URL-адреса из изображений PHAssets, используя следующее (см. Stackru: 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);
}];
}
Затем я использую этот URL-адрес изображения в сгенерированной XML-строке SVG (эта была сгенерирована в симуляторе):
<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 устройства. Я знаю, что есть проблемы с получением общего URL-адреса из PHAsset. URL на симуляторе работает в симуляторе Safari. Но URL, который я возвращаю на реальном устройстве (выглядит как "file:///var/mobile/Media/DCIM/102APPLE/IMG_2405.JPG"), НЕ работал в приложении Safari на устройстве. Я также попытался преобразовать PHAsset в ALAssetURL.. (см. Stackru: как получить alasset-url-from-a-phasset), но это тоже не сработало. Это также возвращает пустое изображение.
Подробности о версии
- Версия iOS: 10.0.2 (реальное устройство), различные версии на сим (8.4, 9.3, 10.0)
- Версия SVGKit: модуль 'SVGKit',: git => ' https://github.com/SVGKit/SVGKit.git ',: branch => '2.x'
1 ответ
SVGKit использует собственные классы Apple для анализа этих URL-адресов и не выполняет никакой дополнительной обработки для них.
Так что... если вы получаете нулевое изображение, вы, вероятно, нарушаете собственные возможности синтаксического анализа NSURL - см. Документацию Apple.
Однако... если вы запустите отладчик XCode, установите точку останова в используемом SVGKit-классе SVGKSourceXXXXX и запустите на устройстве, вы сможете легко увидеть в реальном времени, что не работает и где - я думаю, NSURL, но вы мог бы подтвердить это.