在UITextView中缩放属性文本但保留框架宽度

时间:2014-06-18 11:36:41

标签: ios7 uiscrollview uitextview autolayout nsattributedstring

我尝试在UITextView中缩放可编辑的属性文本,并动态调整textView的宽度。我在UIScrollView中使用UITextView缩放文本没有问题,但我无法确定要更改的内容以保留textView的宽度。

enter image description here

以上文字是我的开头。然后我缩放它并将其裁剪到UIScrollView的边界。

enter image description here

但我真正想要的是能够保留原始宽度并重排文本,就像在此图像中一样。

enter image description here

我真的很感激任何帮助。我正在使用autolayout,iOS 7和xcode 5。

我已尝试缩放字符串中的字体,但iOS7中存在缓冲错误,这意味着UIGestureRecognizerStateChanged通知会被缓冲,并且缩放手势结束后,缩放会持续很长时间,因为字符串不仅仅有几个字体更改。对于那些感兴趣的人来说,这就是我现在所拥有的那些可以扩展字体而不是优雅的字体。

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
    CGFloat scale = 0;
    NSMutableAttributedString *string;

    switch (pinchGestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:
            self.old_scale = 1.0;
            self.last_time = [NSDate date];
            break;

        case UIGestureRecognizerStateChanged:
            scale = pinchGestureRecognizer.scale - self.old_scale;

            if( [self.last_time timeIntervalSinceNow] < -0.2 )  {       //  updating 5 times a second is best I can do - faster than this and we get buffered changes going on for ages!
                self.last_time = [NSDate date];
                string = [self getScaledStringFrom:[self.textview.attributedText mutableCopy] withScale:1.0 + scale];
                if( string )    {
                    self.textview.attributedText = string;
                    self.old_scale = pinchGestureRecognizer.scale;
                }
            }
            break;

        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateFailed:
            break;

        default:
            break;
    }
}

- (NSMutableAttributedString*) getScaledStringFrom:(NSMutableAttributedString*)string withScale:(CGFloat)scale
{
    [string beginEditing];
    [string enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, string.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
        if (value) {
            UIFont *oldFont = (UIFont *)value;
            UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize * scale];
            [string removeAttribute:NSFontAttributeName range:range];
            [string addAttribute:NSFontAttributeName value:newFont range:range];
        }
    }];
    [string endEditing];
    return string;
}

我正在寻找的是我需要在ScrollView,TextView,TextContainer,LayoutManager中更改的框架,或者在缩放/缩放TextView内时,我的字符串在调整后的边框内重排的任何内容。或者,如果有人能够纠正或改进我的代码以使其更高效,我将非常感激。

1 个答案:

答案 0 :(得分:0)

如何使用textContainerInset

所以类似(假设宽度是textview原始宽度)

CGFloat rightInset = width * (pinchGestureRecognizer.scale - 1.);
self.textview.textContainerInset = UIEdgeInsetsMake(0, 0, 0, rightInset);

(我没有测试过这个,让我知道它是否有效)