【发布时间】: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