iOS:缩放UITextView捏?

我感兴趣的是创buildUITextView ,在input文本时dynamic扩展,并在用户捏住屏幕时缩放(类似的行为可以在TinyPost中find)。

当你只是键入(不捏)textView扩展正常。 当你捏(不打字)工作正常,但是当你捏,然后键入,里面的文本被剪切。

这是我的代码:

 UIPinchGestureRecognizer *pinchGestRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleTextView:)]; pinchGestRecognizer.delegate = self; [bgFrameImageView addGestureRecognizer:pinchGestRecognizer]; - (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ createTextView.transform = CGAffineTransformScale(createTextView.transform, pinchGestRecognizer.scale, pinchGestRecognizer.scale); pinchGestRecognizer.scale = 1; } - (void)textViewDidChange:(UITextView *)textView{ CGSize textSize = textView.contentSize; textView.frame = CGRectMake(CGRectGetMinX(textView.frame), CGRectGetMinY(textView.frame), textSize.width, textSize.height); //update the size of the textView } 

你怎么看?

尝试:

 - (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ CGFloat scale = pinchGestRecognizer.scale; createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale]; [self textViewDidChange:createTextView]; } 

它基本上缩放字体大小,然后使用textViewDidChange中的代码重新计算内容大小。

上面详细阐述@Cocoanetics的答案。 我在iOS 7上实现了属性string的手势处理想法,但是当string中的字体变化过多时,速度太慢了。 在iOS 7中,还有一个可笑的缓冲错误,在你停止捏住之后,变化通知会持续很长时间 – 这让我想起早期版本的PC-DOS中的笨键盘缓冲区。 无论如何,我已经把下面的代码放到了这里,尽pipe它只是让我知道这是浪费时间,而且我还需要给用户一些缩放字体的方法。

 - (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; } 

首先在viewDidLoad方法中添加pinchGestureRecognize:

  UIPinchGestureRecognizer *pinchOnTextfield = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextFieldFontOnAddMusicVc:)]; [self.myTextField addGestureRecognizer:pinchOnTextfield]; 

然后把这个方法放在你的viewController中来缩放文本字体:

 - (void)handleTextFieldFontOnAddMusicVc:(UIPinchGestureRecognizer *)pinchGestRecognizer{ if (pinchGestRecognizer.state == UIGestureRecognizerStateEnded || pinchGestRecognizer.state == UIGestureRecognizerStateChanged) { CGFloat currentFontSize = self.myTextField.font.pointSize; CGFloat newScale = currentFontSize * pinchGestRecognizer.scale; if (newScale < 20.0) { newScale = 20.0; } if (newScale > 60.0) { newScale = 60.0; } self.myTextField.font = [UIFont fontWithName:self.myTextField.font.fontName size:newScale]; pinchGestRecognizer.scale = 1; } } 

UITextView是UIScrollView的子类,因此您需要对所有滚动视图执行缩放操作:

  • 设置最小和最大缩放比例属性
  • 通过scrollview委托方法设置viewForZooming

…放大整个文本视图。

如果您只想放大文本,则必须通过捏手势识别器执行这些步骤:

  • 检索当前的属性string
  • 遍历字体范围并用缩放的字体replace字体属性
  • 用您的修改版本replace文本视图中的文本
  • 可能还需要在设置文本后设置文本select

不是最好的,但容易的解决scheme将是:

我不知道你的使用案例,但我认为在许多情况下在input文本的同时支持应用程序缩放缩放是没有意义的。 我只是设置一个标志,防止用户在键入文本时捏缩放。

如果您的意思是通过文本input,编辑文本视图,则可以在捏合手势开始时结束编辑,并在捏合手势结束后开始编辑。