iOS:调整 html 属性字符串中的图像大小

iOS: resize images in html attributed string

我有一个属性字符串,它是从 html 代码

解码而来的
NSAttributedString *htmlstring =[[NSAttributedString alloc] initWithData:[formatString dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                                                                                              NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}documentAttributes:nil error:&error];

并且在字符串中我有多个 img 标签,例如

...
<p style="text-align: left;">
<img src="http://139.196.32.98/ueditor/php/upload/image/20160408/1460107835846711.jpg" alt="1460107835846711.jpg" width="75" height="103" style="width: 75px; height: 103px;"/>
<img src="http://139.196.32.98/ueditor/php/upload/image/20160408/1460106959338375.jpg" alt="1460106959338375.jpg" width="359" height="445" style="width: 359px; height: 445px;"/></p>
...

现在我必须调整图像大小才能修复手机屏幕。 我试过了

 NSString* substring = @"<img";
 NSRange range = [htmlstring rangeOfString:substring];

但它只是returns第一个搜索结果,如何将整个标签变成一个子字符串?

非常感谢

为了在第一次出现之后继续搜索,您需要调整执行搜索的范围。NSString 上有一个方法可以让您这样做:

- [NSString rangeOfString:options:range:];

所以你需要深入 NSAttributedString 并使用它的纯文本表示,可以通过它的只读 string 属性.

所以想法是每次找到匹配项时计算一个新的搜索范围:

NSString *substring = @"<img";
NSString *plainString = [htmlstring string];
NSRange searchRange = NSMakeRange(0, [plainString length]);
NSRange openingTagRange = [plainString rangeOfString:substring options:0 range:searchRange];
while  ( openingTagRange.location < [plainString length] )
{
    NSLog(@"found opening tag at %lu", (unsigned long)openingTagRange.location);
    searchRange.location = NSMaxRange(openingTagRange);
    searchRange.length = [plainString length] - NSMaxRange(openingTagRange);
    openingTagRange = [plainString rangeOfString:openingTagString options:0 range:searchRange];
}

如果你还想把整个标签变成一个子字符串,while 循环展开如下:

while  ( openingTagRange.location < [plainString length] )
{
    searchRange.location = NSMaxRange(openingTagRange);
    searchRange.length = [plainString length] - NSMaxRange(openingTagRange);
    NSRange closingTagRange = [plainString rangeOfString:@">" options:0 range:searchRange];

    if (closingTagRange.location > [plainString length])
    {
        break;
    }

    NSRange wholeTagRange = NSMakeRange(openingTagRange.location, NSMaxRange(closingTagRange) - openingTagRange.location);
    NSString *wholeTagString = [plainString substringWithRange:wholeTagRange];
    NSLog(@"wholeTagString == %@", wholeTagString);
    searchRange.location = NSMaxRange(wholeTagRange);
    searchRange.length = [plainString length] - NSMaxRange(wholeTagRange);
    openingTagRange = [plainString rangeOfString:substring options:0 range:searchRange];
}

请注意,假设遇到的第一个右括号结束标记,我想情况可能并非总是如此。