我尝试在UITextView中缩放可编辑的属性文本,并动态调整textView的宽度。我在UIScrollView中使用UITextView缩放文本没有问题,但我无法确定要更改的内容以保留textView的宽度。
以上文字是我的开头。然后我缩放它并将其裁剪到UIScrollView的边界。
但我真正想要的是能够保留原始宽度并重排文本,就像在此图像中一样。
我真的很感激任何帮助。我正在使用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内时,我的字符串在调整后的边框内重排的任何内容。或者,如果有人能够纠正或改进我的代码以使其更高效,我将非常感激。
答案 0 :(得分:0)
如何使用textContainerInset
?
所以类似(假设宽度是textview原始宽度)
CGFloat rightInset = width * (pinchGestureRecognizer.scale - 1.);
self.textview.textContainerInset = UIEdgeInsetsMake(0, 0, 0, rightInset);
(我没有测试过这个,让我知道它是否有效)