8

我有兴趣创建UITextView,它在输入文本时动态扩展,并在用户捏住屏幕时缩放(类似的行为可以在TinyPost中找到)。iOS:通过捏缩放UITextView?

当你只是键入(不捏)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 
    } 

你觉得呢?

+2

你为什么不只是包装成'UIScrollView'并从'viewForZoomingInScrollView:'方法返回文本视图? – 2012-12-04 14:43:33

回答

11

尝试:

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ 
    CGFloat scale = pinchGestRecognizer.scale; 

    createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale]; 

    [self textViewDidChange:createTextView];  
} 

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

+0

我建议你解释一下每条线的做法 – Sirens

+0

@TheDeveloper完成,对不起, – k20

+0

hi @ k20,我有同样的问题,我用textFiled可以给我一些解决方案...谢谢.. – ilesh

0

的UITextView是UIScrollView的子类,因此你需要做你任何滚动视图怎样做才能使变焦:

  • 设置通过最小和最大变焦倍数性质
  • 设置viewForZooming scrollview委托方法

...放大整个文本视图。

如果只想缩放文字,那么你必须通过捏手势识别来执行这些步骤:

  • 检索当前属性串
  • 通过字体范围
  • 的步行路程,替换的字体属性缩放一个
  • 与修改后的版本替换文本视图中的文本
  • 可能还需要设置文本之后设置文本选择
+1

任何机会,你可以提供示例代码,通过字体范围并增加uitextview属性字符串中的文本大小。我正在努力做到这一点。 –

+0

我没有它方便的ATM,基本上你必须枚举属性字符串的字体属性,然后用缩放的字符替换它。 – Cocoanetics

0

不是最好的,但简单的解决办法是:

我并不确切地知道你的使用情况,但我认为它不会使在许多情况下意义上的应用指缩放支持,同时键入文本。我只会设置一个标志,防止用户在输入文本时捏缩放。

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

2

详细阐述@Cocoanetics上面的答案。我在iOS 7上实现了属性字符串的手势处理想法,但是当字符串中的字体更改过多时,速度过于缓慢。在iOS 7中还有一个可笑的缓冲区错误,其中更改通知在您停止捏合之后长时间持续开启 - 让我想起早期版本的PC-DOS中的笨键盘缓冲区。无论如何,我已经把下面的代码放到了这里 - 尽管它只是告诉我这是浪费时间,而且我还需要给用户一些其他扩展字体的方法。

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

嗨amergin。对这段代码的任何改进或者你真的放弃了它?感谢您的回复。 – Winston

+0

@Winston - 是的,放弃了字体缩放,只是提供用户现在选择的预设尺寸。有点跛脚,但我正在框架的限制内工作。未来可能再试一次,看看底层代码是否有所改进。 – amergin

+0

在我的情况下它工作得很好,因为我没有像你那样多的字体。我现在唯一的问题是限制最大和最小字体大小来停止捏手势,以便文本不会变得太大或太小,有时会消失。有什么建议么?谢谢。 – Winston

2

首先添加pinchGestureRecognize在viewDidLoad方法:

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; 

     } 

    } 
+0

当放大和缩小适用于uitextview时,那时原始textview格式不应该chnage。但它会chnage和粗体和斜体文本转换为简单的文本 –

+0

在我的情况下,这是比选定的答案更好的解决方案:)谢谢! – Panayot