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:'? –

ответ

11

Try:

- (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 delegate method

... который увеличивает масштаб всего текста.

Если вы хотите, чтобы увеличить текст, то вы должны выполнить эти действия с помощью прижимного жеста распознавателя:

  • получить текущее приписываемое строку
  • прогулки по диапазонам шрифта и заменить атрибут шрифта с масштабируется один
  • заменить текст в текстовом виде с измененной версией
  • вероятно, вы также должны установить выделение текста после установки текста
+1

любой шанс, что вы могли бы предоставить образец кода для прохода через шрифт диапазонов и увеличения размера текста в строке атрибутов uitextview. Я пытаюсь сделать именно это. –

+0

У меня нет удобного банкомата, по сути вам нужно просто перечислить атрибут шрифта в атрибутной строке, а затем заменить его на масштабированный. – 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

Hi amergin. Любые улучшения в этом коде или вы действительно отказались от него? Спасибо за ваш ответ. – Winston

+0

@Winston - да, отказался от масштабирования шрифта и просто предложил предустановленные размеры для пользователя, чтобы выбрать сейчас. Бит хромой, но я работаю в рамках ограничений фреймворка. Можете попробовать еще раз в будущем, чтобы увидеть, улучшился ли базовый код. – amergin

+0

В моем случае это работает очень хорошо, потому что у меня не так много шрифтов, как у вас. Моя единственная проблема теперь ограничивает максимальный и минимальный размер шрифта, чтобы остановить жест жестки, чтобы текст не становился слишком большим или слишком маленьким, а иногда и исчезал. Какие-либо предложения? Спасибо. – Winston

2

Прежде всего добавить pinchGestureRecognize в методе viewDidLoad:

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

затем поместить этот метод в ViewController масштабе TextField шрифта:

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

Когда Zoom in & out применяется к uitextview, в это время исходное форматирование текстового поля не должно быть чередованием. Но это будет chnage и жирным и курсивом конвертировать текст простым текстом –

+0

В моем случае это лучшее решение, чем выбранный ответ :) Спасибо! – Panayot

Смежные вопросы