8

Jestem zainteresowany tworzeniem UITextView, który rozwija się dynamicznie podczas pisania tekstu i skalowania, gdy użytkownik szczypie ekran (podobne zachowanie można znaleźć w TinyPost).iOS: Skalowanie UITextView z szczypaniem?

Po prostu wpisz (bez szczypania) textView rozwija się dobrze. Kiedy tylko szczypanie (bez pisania) działa dobrze, ale kiedy szczypiesz i piszesz, tekst w środku zostaje odcięty.

Oto mój kod:

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 
    } 

Co o tym sądzisz?

+2

Dlaczego nie można po prostu zawinąć go w a 'UIScrollView' i zwraca widok tekstowy z metody' viewForZoomingInScrollView: '? –

Odpowiedz

11

Spróbuj:

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

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

    [self textViewDidChange:createTextView];  
} 

Zasadniczo skaluje rozmiar czcionki, a następnie przelicza wielkość treści przy użyciu kodu w textViewDidChange.

+0

Polecam, aby wyjaśnić, co każda linia robi – Sirens

+0

@TheDeveloper zrobić, przepraszam za to – k20

+0

hi @ k20, mam ten sam problem i używam textFiled może mi dać jakieś rozwiązanie ... Dzięki .. – ilesh

0

UITextView jest podklasą UIScrollView i jako takie trzeba zrobić, co zrobić z dowolnego widoku przewijania, aby umożliwić powiększania:

  • ustawić minimalny i maksymalny zoom właściwości
  • ustawić viewForZooming poprzez metoda rzutowania przewijania

... która powiększa cały widok tekstu.

Jeśli chcesz tylko powiększać tekst następnie trzeba wykonać kroki za pomocą rozpoznawania gestu pinch:

  • pobrać bieżący nadany ciąg
  • spacer zakresów czcionek i zastąpić atrybut czcionki z skalowany jedną
  • zastąpić tekst w widoku tekstu ze swojej zmodyfikowanej wersji
  • prawdopodobnie trzeba także ustawić zaznaczenie tekstu po ustawieniu tekst
+1

każda szansa, że ​​możesz podać przykładowy kod do przechodzenia przez czcionkę zakresy i zwiększenie rozmiaru tekstu w ciągu atrybutów uitextview. Próbuję to zrobić. –

+0

Nie mam tego poręcznego bankomatu, w zasadzie trzeba tylko wyliczyć atrybut czcionki na przypisanym ciągu, a następnie zastąpić go skalowanym. – Cocoanetics

0

Nie najlepsze, ale proste rozwiązanie byłoby:

Nie wiem dokładnie swój przypadek użycia, ale myślę, że nie ma sensu w wielu przypadkach do wsparcia w pinch zoom app podczas wpisywania tekstu. Po prostu ustawiłbym flagę, która zapobiega powiększaniu szczypców podczas pisania tekstu przez użytkownika.

Jeśli masz na myśli pisanie tekstem, edytując widok tekstowy, możesz zakończyć edycję na początku gestu szczypania i rozpocząć edycję po zakończeniu gestu szczypania.

2

Aby rozwinąć odpowiedź @Cocoanetics powyżej. Zaimplementowałem pomysł obsługi gestów dla przypisywanych ciągów na iOS 7, ale jest on zaporowo wolny, gdy w łańcuchu występuje zbyt wiele zmian czcionki. Istnieje także śmieszny błąd buforowania w systemie iOS 7, w którym powiadomienia o zmianach są uruchamiane długo po tym, jak przestaniesz się zacinać - przypomina mi to głupi bufor klawiatury we wczesnych wersjach systemu PC-DOS. W każdym razie, umieściłem poniższy kod, który sprawił, że działało to dla mnie - chociaż spowodowało to tylko poinformowanie mnie, że jest to strata czasu i że muszę dać moim użytkownikom inny sposób skalowania ich czcionek.

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

Cześć amergin. Jakieś ulepszenia tego kodu, czy naprawdę go porzuciłeś? Dzięki za odpowiedź. – Winston

+0

@Winston - tak, porzuciłem skalowanie czcionek i zaoferowałem właśnie gotowe rozmiary dla użytkownika. Trochę lame, ale pracuję w ramach ograniczeń frameworków. Może spróbujemy jeszcze raz w przyszłości, aby sprawdzić, czy poprawiony został podstawowy kod. – amergin

+0

W moim przypadku działa naprawdę dobrze, ponieważ nie mam tak wielu czcionek jak ty. Teraz moim jedynym problemem jest ograniczenie maksymalnych i minimalnych rozmiarów czcionek, aby zatrzymać szczypanie, aby tekst nie stał się zbyt duży lub zbyt mały, a czasem znikał. Jakieś sugestie? Dziękuję Ci. – Winston

2

Przede wszystkim dodać pinchGestureRecognize w metodzie viewDidLoad:

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

następnie umieścić tę metodę w swojej viewController skalować textfield czcionki:

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

Gdy powiększanie i pomniejszanie stosuje się do uitextview, wówczas oryginalne formatowanie tekstu nie powinno się zmieniać. Ale to będzie chnage i pogrubiony i kursywny tekst konwertować prostym tekstem –

+0

W moim przypadku jest to lepsze rozwiązanie niż wybrana odpowiedź :) Dzięki! – Panayot

Powiązane problemy