【问题标题】:Scale attributed text in a UITextView but retain frame width在 UITextView 中缩放属性文本但保留框架宽度
【发布时间】:2014-06-18 11:36:40
【问题描述】:

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

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

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

我非常感谢您对此的任何帮助。我正在使用自动布局、iOS 7 和 xcode 5。

我尝试过缩放字符串中的字体,但 iOS7 中存在一个缓冲错误,这意味着 UIGestureRecognizerStateChanged 通知被缓冲,并且在捏合手势结束后,缩放会继续很长时间,因为属性字符串不止一些字体更改。对于那些感兴趣的人来说,这是我目前拥有的 botch,它确实可以缩放字体,但一点也不优雅。

- (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 被缩放/缩放时在调整后的边框内重排的框架。或者,如果有人可以更正或改进我的代码以提高性能,我将不胜感激。

【问题讨论】:

  • 如何扩展?更改 NSAttributedString 的大小字体会不会很有趣?
  • 嗨@Larme,我在 UIScrollView 中使用捏合手势进行缩放。我确实尝试过缩放字体,但随着属性字符串的复杂性增加,这可能会变得站不住脚。
  • 您是否也有“普通”文本(未归于其中)的问题?我仍然会改变字体大小。从其他讨论中,这是使用的技术:stackoverflow.com/questions/13669457/…
  • 不,就是这样,我之前的代码在我使用非属性文本时运行良好,因为我可以缩放字体。现在的问题是,任何复杂的缩放都会减慢,这就是为什么我试图在实际文本视图上使用转换,这样它的所有字体都会被缩放,而不必遍历它来替换所有字体。

标签: ios7 uiscrollview uitextview autolayout nsattributedstring


【解决方案1】:

使用textContainerInset 怎么样?

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

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

(我没有测试这个,如果它有效,请告诉我)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2014-12-08
    相关资源
    最近更新 更多