2013-11-15 24 views
11

UITextView'de arabelleğin yeni satıra gittiğini algılamaya çalışıyorum. Ben UITextView genişliğinde karşılaştırılması toplam sonradan genişlik bunu saptayabilir:Yeni satır UITextView'da başladığı anı algıla.

CGSize size = [textView.text sizeWithAttributes:textView.typingAttributes]; 
if(size.width > textView.bounds.size.width) 
     NSLog (@"New line"); 

Ama doğru şekilde çalışmıyor doz değil -sizeWithAttributes:textView getiri girinti genişliği olmadan harflerin sadece genişliği nedeniyle. Lütfen bunu çözmenize yardımcı olun.

+0

bu kullandığınız UITextView' veya Subclassed versiyonu 'standart var mı? – n00bProgrammer

+0

Standart bir – mriddi

cevap

24

Bu benim yapacağını nasıl desteklemesi halinde boundingRectWithSize:options:attributes:context: kullanmak (iOS 6 veya daha önceki desteklemek için gerekirse):

  • son karakterin UITextPosition alın.
  • UITextView numaralı telefondan caretRectForPosition numaralı telefonu arayın.
  • CGRect değişken oluşturun ve CGRectZero ürününü depolayın.
  • textViewDidChange: yönteminizde, UITextPosition'u geçerek caretRectForPosition: numaralı telefonu arayın.
  • CGRect değişkeninde depolanan geçerli değerle karşılaştırın. CaretRect'in yeni y-kökü sonuncusundan daha büyükse, yeni bir satıra ulaşılmış demektir.

örnek kod: Ayrıca

CGRect previousRect = CGRectZero; 
- (void)textViewDidChange:(UITextView *)textView{ 

    UITextPosition* pos = yourTextView.endOfDocument;//explore others like beginningOfDocument if you want to customize the behaviour 
    CGRect currentRect = [yourTextView caretRectForPosition:pos]; 

    if (currentRect.origin.y > previousRect.origin.y){ 
      //new line reached, write your code 
     } 
    previousRect = currentRect; 

} 

, sen UITextInput protokol referansı here belgelerine okumalısınız. Bu büyülü, sana söylüyorum.

Bu konuda başka sorunlarınız varsa lütfen bize bildirin.

+0

@mriddi. Sana bir iskelet yapısı verdim. İhtiyacınıza göre şartlar eklemek için * sahibi * olacaksınız. Örneğin, metninizin ortasındaki kodu düzenleme veya kelimeleri veya karakterleri değiştirme. – n00bProgrammer

+0

Bu muhteşem – mriddi

+0

Bunun işe yaramayacağı durumlar var. Kullanıcı metne yapıştığında ve düzeltme işareti işlemde ne zaman taşınır? – rmaddy

0

Metnin yüksekliğini değil, genişliğini almanız gerekir. Kullanın ya sizeWithFont:constrainedToSize:lineBreakMode: veya yalnızca iOS 7.

+0

Sadece IOS7'dir. Plz ikinci bir – mriddi

+0

kullanma hakkında daha fazla bilgi Dokümanlar bakın. Kullandığınız "sizeWithAttributes:" yöntemine benzer. Sadece bir boyutta geçmelisin. İstenilen genişliğe ve gerçekten büyük bir yüksekliğe sahip bir boyutta geçirin. İade edilen boyut, metnin genişliğe sığması için gereken yükseklikle aynı olacaktır. – rmaddy

4

Swift kullanım için UITextViewDelegate

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText: (NSString *)text 
{ 
    BOOL newLine = [text isEqualToString:@"\n"]; 
    if(newLine) 
    { 
      NSLog(@"User started a new line"); 
    } 
    return YES; 
} 
+0

Bu kabul edilen cevap olmalı. Bu en zarif. Geçerli kabul edilen cevap çok rahatsız. –

6

kullanabileceğiniz bu

previousRect = CGRectZero 

func textViewDidChange(textView: UITextView) { 

     var pos = textView.endOfDocument 
     var currentRect = textView.caretRectForPosition(pos) 
     if(currentRect.origin.y > previousRect?.origin.y){ 
      //new line reached, write your code 
     } 
     previousRect = currentRect 

    } 
2

Swift 3

kabul cevap ve hızlı versiyonu çalışıyor, ama burada bir Swift olduğunu Tembel insanlar için 3 versiyon var. daha hassas satır sonu algılama Swift-4 olarak n00bProgrammer @arasında

class CustomViewController: UIViewController, UITextViewDelegate { 

    let textView = UITextView(frame: .zero) 
    var previousRect = CGRect.zero 

    override func viewDidLoad(){ 
     textView.frame = CGRect(
      x: 20, 
      y: 0, 
      width: view.frame.width, 
      height: 50 
     ) 
     textView.delegate = self 
     view.addSubview(textView) 
    } 

    func textViewDidChange(_ textView: UITextView) { 
     let pos = textView.endOfDocument 
     let currentRect = textView.caretRect(for: pos) 
     if previousRect != CGRect.zero { 
      if currentRect.origin.y > previousRect.origin.y { 
       print("new line") 
      } 
     } 
     previousRect = currentRect 
    } 
} 
0

cevap. cevabı, kullanıcının bir ilk satırda yazarak başladığında saatin farklı tepki verir tek bir şey dışında mükemmel n00bProgrammer @

, çok olduğunu Started New Line sunar.
konuyla aşarak, burada rafine kod

var previousRect = CGRect.zero 
    func textViewDidChange(_ textView: UITextView) { 
     let pos = textView.endOfDocument 
     let currentRect = textView.caretRect(for: pos) 
     self.previousRect = self.previousRect.origin.y == 0.0 ? currentRect : previousRect 
     if(currentRect.origin.y > previousRect.origin.y){ 
      //new line reached, write your code 
      print("Started New Line") 
     } 
     previousRect = currentRect 
    }