Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS:使用pinching缩放UITextView?_Iphone_Ios_Uitextview_Uigesturerecognizer_Uipinchgesturerecognizer - Fatal编程技术网

Iphone iOS:使用pinching缩放UITextView?

Iphone iOS:使用pinching缩放UITextView?,iphone,ios,uitextview,uigesturerecognizer,uipinchgesturerecognizer,Iphone,Ios,Uitextview,Uigesturerecognizer,Uipinchgesturerecognizer,我感兴趣的是创建UITextView,它在键入文本时动态扩展,并在用户挤压屏幕时缩放(类似的行为可以在TinyPost中找到) 当您只需键入(不捏)文本视图即可展开。当你只是捏(不打字)的时候效果很好,但是当你捏然后打字的时候,里面的文本会被剪切 这是我的密码: UIPinchGestureRecognizer *pinchGestRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector

我感兴趣的是创建
UITextView
,它在键入文本时动态扩展,并在用户挤压屏幕时缩放(类似的行为可以在TinyPost中找到)

当您只需键入(不捏)文本视图即可展开。当你只是捏(不打字)的时候效果很好,但是当你捏然后打字的时候,里面的文本会被剪切

这是我的密码:

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中的代码重新计算内容大小。

UITextView是UIScrollView的一个子类,因此您需要对任何滚动视图执行操作以启用缩放:

  • 设置最小和最大缩放比例特性
  • 通过scrollview委托方法将视图设置为缩放
。。。这将缩放整个文本视图

如果只想缩放文本,则必须通过按压手势识别器执行以下步骤:

  • 检索当前属性化字符串
  • 浏览字体范围并用缩放的字体属性替换字体属性
  • 用修改后的版本替换文本视图中的文本
  • 在设置文本后,可能还需要设置文本选择

    • 不是最好但简单的解决方案是:

      我不知道您的具体用例,但我认为在很多情况下,在应用程序中输入文本时支持收缩缩放是没有意义的。我只需要设置一个标志,它可以防止用户在键入文本时收缩缩放


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

      要详细说明上述@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;
      }
      
      -(void)scaleTextView:(UIPinchGetUreRecognitor*)PinchGetUreRecognitor
      {
      CGFloat标度=0;
      nsmutableAttributeString*字符串;
      开关(PinchGestureRecognitor.state){
      案例UIgestureRecognitzerStateStart:
      self.old_量表=1.0;
      self.last_time=[NSDate-date];
      打破
      案例UIgestureRecognitzerStateChanged:
      scale=pinchGestureRecognizer.scale-self.old_scale;
      如果([self.last_time timeIntervalSinceNow]<-0.2){//每秒更新5次是我能做的最好的事情-比这更快,而且我们会得到长时间的缓冲更改!
      self.last_time=[NSDate-date];
      string=[self-getScaledStringFrom:[self.textview.attributedText-mutableCopy],带刻度:1.0+刻度];
      如果(字符串){
      self.textview.attributedText=字符串;
      self.old_scale=pinchgestrerecognizer.scale;
      }
      }
      打破
      案例UIgestureRecognitzerStateEnded:
      案例UIgestureRecognitizerState已取消:
      案例UIgestureRecognitzerStateFailed:
      打破
      违约:
      打破
      }
      }
      -(NSMutableAttributedString*)getScaledStringFrom:(NSMutableAttributedString*)带刻度的字符串:(CGFloat)刻度
      {
      [字符串开始编辑];
      [字符串枚举属性:NSFontAttributeName inRange:NSMakeRange(0,string.length)选项:0使用块:^(id值,NSRange范围,BOOL*stop){
      如果(值){
      UIFont*oldFont=(UIFont*)值;
      UIFont*newFont=[oldFont fontWithSize:oldFont.pointSize*scale];
      [字符串removeAttribute:NSFontAttributeName范围:范围];
      [字符串addAttribute:NSFontAttributeName值:新字体范围:范围];
      }
      }];
      [字符串重新编辑];
      返回字符串;
      }
      
      首先,在
      viewDidLoad
      方法中添加
      uipinchgeturerecognizer

      UIPinchGestureRecognizer *pinchOnTextfield = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextFieldFontOnAddMusicVc:)];
      [self.myTextField addGestureRecognizer:pinchOnTextfield];
      
      然后将此方法放入
      viewController
      以缩放
      textField
      font:

      - (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;
      
          }    
      }
      
      -(void)handleTextFieldFontOnAddMusicVc:(UIPinchGestureRecognitor*)PinchGestRecognitor{
      如果(pinchGestRecognizer.state==UIGestureRecognizerStateEnded | | pinchGestRecognizer.state==UIGestureRecognizerStateChanged){
      CGFloat currentFontSize=self.myTextField.font.pointSize;
      CGFloat newScale=currentFontSize*pinchGestrocgnizer.scale;
      如果(新闻级<20.0){
      newScale=20.0;
      }
      如果(新闻比例>60.0){
      newScale=60.0;
      }
      self.myTextField.font=[UIFont fontWithName:self.myTextField.font.fontName大小:newScale];
      PinchGestrocgnizer.scale=1;
      }    
      }
      
      为什么不将其包装到
      UIScrollView
      中,然后从
      视图返回文本视图,以便缩放ScrollView:
      方法?我建议您解释每一行在k20时的作用,我也有同样的问题,我使用TextField,你能给我一些解决方案吗…谢谢..如果你想在不改变字体属性的情况下缩放UITextView,请在这里检查我的答案:你有没有可能提供示例代码来遍历字体范围并增加UITextView属性字符串中的文本大小。我正试着这么做。我手头没有,基本上你只需要枚举属性字符串上的字体属性,然后用一个缩放的替换它。嗨,amergin。这段代码有什么改进吗?或者你真的放弃了它吗?谢谢你的回复。@Winston-是的,放弃了字体缩放,现在只提供预设大小供用户选择。有点跛,但我在工作