2011-12-30 24 views
7

'dan nasıl alabilirim UIPopoverController görüntülenen bir metnin kenarından UITextView görüntülemeye çalışıyorum, seçili metni nasıl alabilirim CGRect?Seçilen metin çerçevesini bir UITextView

Teşekkürler!

+0

Bu soru ne olduğunu düşündüğüm şey buysa, UIPopoverController başlığında muhtemelen yanıltıcı mıdır? CGPoint'i metin seçiminden almak istiyorsunuz, UIPopoverController'a özel bir şey değil, değil mi? – barley

+0

Öneriniz önerildi olarak başlığı düzeltildi @barley. – Till

cevap

33

Sanırım [UITextInput selectedTextRange] ve [UITextInput caretRectForPosition:], sizin için uygun olanıdır.

[UITextInput selectedTextRange]

[UITextInput caretRectForPosition:] Bu giriş karakter aralığının CGRect döner karakteri için seçilen aralığı döndürür. (iOS 5'ten beri) uyumludur, dolayısıyla UITextView örneğiniz için bu yöntemleri kullanabilirsiniz.

Böyle bir şey olacak.

UITextRange * selectionRange = [textView selectedTextRange]; 
CGRect selectionStartRect = [textView caretRectForPosition:selectionRange.start]; 
CGRect selectionEndRect = [textView caretRectForPosition:selectionRange.end]; 
CGPoint selectionCenterPoint = (CGPoint){(selectionStartRect.origin.x + selectionEndRect.origin.x)/2,(selectionStartRect.origin.y + selectionStartRect.size.height/2)}; 

DÜZENLEME: Örnek kodun alınması zor hale geldiğinden, tamamlayıcı bir resim ekledim.

An image that illustrates what local variables represent

+0

Küçük sorun, bunu orta nokta olarak adlandırıyorsunuz, ancak aslında sağ alt noktayı hesaplıyorsunuz. – Till

+0

@Till Evet, başlangıçta [UITextInput caretRectForPosition:] giriş olarak UITextRange alacağını düşündüm, ancak (adından da anlaşılacağı gibi) aslında UITextPosition alır. Örnek kodu tamir ettim ve sanırım biraz daha zor olsa da artık daha doğru olduğunu düşünüyorum. Ve baskı için teşekkürler! – barley

+0

Hala merkez hesaplamasında ufak bir sorun var: D ... X-koordinatını tekrar kontrol edin, parantezler yanlış olarak merkezin kalibre edilmesi için ayarlanmış. – Till

19

Barley cevabı aslında seçim merkezini vermeyecektir bazı durumlar vardır. Örneğin:

Screenshot showing an example of where using the caret rects would not be accurate

Bu durumda Kopyala/Yapıştır menüsü metin alanının tüm genişliğini kapsayan seçimi, merkezinde görüntülüyor görebilirsiniz. Fakat iki caret rektinin merkezini hesaplamak, sağa çok daha fazla bir pozisyon verecekti.

Sen Ayrıca yine iOS 4 desteklenmesi ve bu cevaplar birini kullanarak yapıyorsanız, bu yöntemler olduğundan emin olmak gerekir etmediğini açıkça değer selectionRectsForRange:

UITextRange *selectionRange = [textView selectedTextRange]; 
NSArray *selectionRects = [self.textView selectionRectsForRange:selectionRange]; 
CGRect completeRect = CGRectNull; 
for (UITextSelectionRect *selectionRect in selectionRects) { 
    if (CGRectIsNull(completeRect)) { 
     completeRect = selectionRect.rect; 
    } else completeRect = CGRectUnion(completeRect,selectionRect.rect); 
} 

kullanarak daha kesin bir sonuç elde edebilirsiniz onları çağırmadan önce desteklenir: if ([textView respondsToSelector:@selector(selectedTextRange)]) { …

+0

Mükemmel, bir çekicilik gibi çalıştı – aryaxt

+2

CGRectUnion zaten bunu ele alır gibi aslında CGRectIsNull için çekime ihtiyacınız yok. CGRectUnion belgelerine göre: "Dikdörtgenlerden herhangi biri boş bir dikdörtgense, diğer dikdörtgenin bir kopyası döndürülür" –

İlgili konular