2011-05-20 24 views

cevap

4

Bunu yapmamın yolu, her paragrafın tüm boyutlarını hesaplamaktır. SizeWithFont: constrainedToSize: lineBreakMode:

[textView contentOffset] içinden hangi paragrafın görülebileceğini öğrenebilirsiniz.

kaydırmak için, scrollRangeToVisible kullanın, sadece setContentOffset kullanın: Bunun için CGPoint y parametresi ya bir sonraki paragrafa kadar tüm yükseklik boyutlarının toplamı olmalıdır, yoksa yalnızca textView.frame.size.height değerini ekleyin. Bir sonraki paragrafın başlangıcından daha yakındır.

Bu anlamlı? Burada başka bir çözüm bulmak

CGFloat paragraphOffset[MAX_PARAGRAPHS]; 

    CGSize constraint = CGSizeMake(widthOfTextView, 999999 /*arbitrarily large number*/); 
    NSInteger paragraphNo = 0; 
    CGFloat offset = 0; 

    for (NSString* paragraph in paragraphs) { 
     paragraphOffset[paragraphNo++] = offset; 
     CGSize paragraphSize = [paragraph sizeWithFont:textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
     offset += paragraphSize.height; 
    } 

    // find visible paragraph 
    NSInteger visibleParagraph = 0; 
    while (paragraphOffset[visibleParagraph++] < textView.contentOffset.y); 


    // scroll to paragraph 6 
    [textView setContentOffset:CGPointMake(0, paragraphOffset[6]) animated:YES]; 
+0

Bir örnek kod verebilir misiniz? Ne kadar büyüklükten emin değilimWithFont: constrainedToSize: lineBreakMode: çalışır, ne için kısıtlanmışToSize: argüman? –

+0

yukarıdaki kodu ekledi. FYI paragrafları –

+2

paragraf dizelerinin bir NSArray'idir. 9999999 tarafından FLT_MAX (büyük bir değer için varsayılan iPhone değişkeni) değiştirebileceğinize dikkat edin. – Niko

1

Seçeneklerden biri olan metin görünümü kaydırmak için geçerli görünür metin aralığını bulmak ve uygun aralığını hesaplamak ve scrollRangeToVisible: kullanmak için kullanmak istiyorum UITextView yerine bir UIWebView kullanın. Metindeki uygun yerlere ilerlemek için daha sonra çapa ve javascript kullanabilirsiniz. Bunu kolaylaştırmak için çapaları her paragrafın başında programatik olarak ekleyebilirsiniz.

+0

Javascript ve karmaşık html öğelerini bilmiyorum, bana bir örnek verebilir misiniz? Ayrıca UIWebView, UITextView –

+0

@ xlc0212 ile uğraşmak zor olabilir: Düzenlemeye ihtiyacınız yoksa, bir UIWebview kullanmak, kaydırmanız gereken her zaman bir UITextView'in metin boyutunu hesaplamaktan çok daha kolay olacaktır (ve muhtemelen daha hızlı). Sadece 'html çapa' neyin olduğuna bak - karmaşık bir şey değil. – roop

7

: Yanıtta

(denenmemiş) requst kodu feryat yorum yapmak. Bu sorunu gözlerimde çözmenin daha iyi bir yolu. https://stackoverflow.com/a/9283311/889892

UITextView UIScrollView'ın bir alt sınıfı olduğundan, onun sınır özelliği, koordinat sisteminin görünür kısmını yansıtır. Yani böyle bir şey çalışması gerekir:

-(NSRange)visibleRangeOfTextView:(UITextView *)textView { 
    CGRect bounds = textView.bounds; 
    UITextPosition *start = [textView characterRangeAtPoint:bounds.origin].start; 
    UITextPosition *end = [textView characterRangeAtPoint:CGPointMake(CGRectGetMaxX(bounds), CGRectGetMaxY(bounds))].end; 
    return NSMakeRange([textView offsetFromPosition:textView.beginningOfDocument toPosition:start], 
     [textView offsetFromPosition:start toPosition:end]); 
} 

Bu yukarıdan alt soldan sağa metin düzenini varsayar. Diğer düzen yönergeleri için çalışmak istiyorsanız, daha fazla çalışmak zorunda kalacaksınız. :) Eğer Swift çözüm istiyorsanız

+0

"Bunun gibi bir şey işe yarayacak" derken, gerçekten denediniz mi? Bu benim için görsel görsel metnin neredeyse üç katına çıkıyor. Teşekkürler. –

2

Bunu kullanın: yanıt "Ölüm ait Noodle" dayalı

public extension UITextView { 

    public var visibleRange: NSRange? { 
     if let start = closestPositionToPoint(contentOffset) { 
      if let end = characterRangeAtPoint(CGPointMake(contentOffset.x + CGRectGetMaxX(bounds), contentOffset.y + CGRectGetMaxY(bounds)))?.end { 
       return NSMakeRange(offsetFromPosition(beginningOfDocument, toPosition: start), offsetFromPosition(start, toPosition: end)) 
      } 
     } 
     return nil 
    } 
} 
0

Swift 3.0/3.1 çözüm.

public extension UITextView { 

    public var visibleRange: NSRange? { 
     if let start = closestPosition(to: contentOffset) { 
      if let end = characterRange(at: CGPoint(x: contentOffset.x + bounds.maxX, y: contentOffset.y + bounds.maxY))?.end { 
       return NSMakeRange(offset(from: beginningOfDocument, to: start), offset(from: start, to: end)) 
      } 
     } 
     return nil 
    } 
} 
İlgili konular