2009-07-24 15 views
28

UITableViewCell'da bulunan UITextView var. Düzen, ilk başta görüntülendiğinde doğrudur, ancak UITextView'a tıkladıktan sonra otomatik olarak bir miktar yukarı kaydırır ve ilk satırdaki karakterlerin üst yarısı görünmez olur.
UITextView not active http://gerodt.homeip.net/uitextview-notactive.pngUITextView, girerken yukarı doğru kaymayı nasıl engeller

Ve onu aktif hale getirmek için UITextView yılında tıklandığında bu biridir:
UITextView active http://gerodt.homeip.net/uitextview-active.png

Ben kaydırmak için UITextView yok UITextView değil aktifken

Bu resimdir her şeyden önce, sabit kalmalı. Bunu nasıl başarabilirim? Zaten Interface Builder'da birkaç ayar denedim, ancak şimdiye kadar hiç şans yoktu.

Herhangi bir öneri takdir edilir.

Gero

+0

SDK'nın hangi sürümünü kullanıyorsunuz? 3.0? – hanleyp

+0

Evet, SDK 3.0 kullanıyorum – Gero

cevap

16

Bu UITextView Apple'ın mühendisi göre bu amaçlanmaktadır davranır ve UITextView en az yükseklik birkaç hatlardır metin içindir nasıl. Bunun etrafında bir iş yoktur, bunun yerine bir UITextField kullanın veya UITextView'ınızı en az 3 satırlık bir boyuta yükseltin.

+1

Teşekkürler. 55'e yükselttim ve 12 yazı tipi ile şimdi istediğim gibi çalışıyor. – Gero

61

UITextView, UIScrollView'ın bir alt sınıfıdır, bu nedenle yapılandırılabilir bir contentInset özelliği vardır. Ne yazık ki, bir UITextView örneğindeki contentInset'i değiştirmeye çalışırsanız, alt kenardaki giriş her zaman 32'ye sıfırlanır. Kısa bir UITextView çerçeveleri ile daha önce buna başladım ve bunu bir sorun olarak görüyorum. Sorunun neden kaynaklandığından şüpheleniyorum, ancak emin olmak için hata ayıklayıcıdaki textview öğesinin contentInset'ini kontrol etmelisiniz.

Çözüm/çözüm basit: alt sınıf UITextView ve contentInset yöntemini geçersiz kılar, böylece her zaman UIEdgeInsetZero döndürür. Bu deneyin: Ben istenmeyen UITextView kaydırma ile benzer bir sorun yaşıyorsanız edildi

// 
// BCTextView 
// 
// UITextView seems to automatically be resetting the contentInset 
// bottom margin to 32.0f, causing strange scroll behavior in our small 
// textView. Maybe there is a setting for this, but it seems like odd behavior. 
// override contentInset to always be zero. 
// 
@interface BCZeroEdgeTextView : UITextView 
@end 

@implementation BCZeroEdgeTextView 

- (UIEdgeInsets) contentInset { return UIEdgeInsetsZero; } 

@end 
+0

Teşekkür ederim, benim için harika çalışıyor. – Ievgen

+1

Ve ben, sadece aradığım şey. –

+0

sen D adamsın! Teşekkürler!!!!!!!!!! – SpaceDog

1

. 'Benim durumumda

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; 

Ben yapmadım: Sonunda Ayrıca böylece gibi klavye bildirimi için kayıt olmanız gerekecektir benim keyboardDidShow:

- (void)keyboardDidShow:(NSNotification *)notification { 
    textView.contentSize = CGSizeZero; 
} 

sonunda contentSize sıfırlayarak bunu düzeltmek başardı çerçeveyi textViewDidChange (UIScrollView içinde artan metin görünümü) olduğunda, textView'un contentSize yüksekliğine sıfırladığından beri kaydırma yapmak istemiyorum.

6

Ayrıca sadece yapabilirsiniz:

textView.contentInset=UIEdgeInsetsZero; 

Temsilci dosyasında.

+1

Harika çalışıyor! –

0

Metin alanına, Ölçeklendirmeden Doldur'a yerine Redraw yazmayı deneyin. Temsilciyi yakalamanız ve içeriği dengelemeniz gerekebilir, ancak en azından atlama işlemini noktaya (0,0) getirmelidir. Ayrıca Otomatik yeniden oluştur alt görünümü kapatılmalıdır. Bana her seferinde metin manzarasının üstüne atlıyordu ve bu da bu problemi çözdü.

enter image description here

2

UITextViewUIScrollView bir alt sınıfıdır, bu nedenle cevap, değil-parçalar veya içerik boyutu değiştiriliyor budur contentOffset özelliğini kapsar. Görünüm ilk görüntülendiğinde kaydırma konumu doğruysa, daha sonra geri çağırma için içerik ofsetini saklayabilirsiniz.

YourViewController.h

@interface YourViewController : UIViewController <UITextViewDelegate, UIScrollViewDelegate> 

@property(nonatomic, weak) IBOutlet UITextView *textView; 

@end 

YourViewController.m yukarıda geçen yöntemdir kod örneğinde dikkat etmek de önemlidir Ne

@implementation YourViewController { 
@private 
    BOOL _freezeScrolling; 
    CGFloat _lastContentOffsetY; 
} 

// UITextViewDelegate 
- (void)textViewDidBeginEditing:(UITextView *)textView { 
    // tell the view to hold the scrolling 
    _freezeScrolling = YES; 
    _lastContentOffsetY = self.textView.contentOffset.y; 
} 

// UITextViewDelegate 
- (void)textViewDidEndEditing:(UITextView *)textView { 
    _freezeScrolling = NO; 
} 

// UIScrollViewDelegate 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (_freezeScrolling) { 
     // prevent the scroll view from actually scrolling when we don't want it to 
     [self repositionScrollView:scrollView newOffset:CGPointMake(scrollView.contentOffset.x, _lastContentOffsetY)]; 
    } 
} 

// UIScrollViewDelegate 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    // scroll prevention should only be a given scroll event and turned back off afterward 
    _freezeScrolling = NO; 
} 

// UIScrollViewDelegate 
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    // when the layout is redrawn, scrolling animates. this ensures that we are freeing the view to scroll 
    _freezeScrolling = NO; 
} 

/** 
This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method. 
*/ 
- (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset { 
    CGRect scrollBounds = scrollView.bounds; 
    scrollBounds.origin = offset; 
    scrollView.bounds = scrollBounds; 
} 

pasajı parça alınmıştır. setContentOffset:'un herhangi bir türünün çağrılması aslında kaydırma işlemini tetikleyecektir, bu da scrollViewDidScroll: numaralı çağrıya neden olur. Böylece setContentOffset: numaralı çağrı, sonsuz bir döngü ile sonuçlanır. Kaydırma sınırlarını ayarlamak, bunun için geçici çözümdür. Özetle, görüntü denetleyicisine, kullanıcının düzenleme için metni seçtiğini algıladığında UITextView'un kaymasını engellemesini söyleriz. Mevcut içerik ofsetini de saklıyoruz (çünkü konumun istediğimiz şey olduğunu biliyoruz). UITextView kaydırmaya çalışırsa, kaydırma duruncaya kadar içerik ofsetini yerinde tutarız (bu, scrollViewDidEndDecelerating: veya scrollViewDidEndScrollingAnimation:'u tetikler). Kullanıcı düzenlemeyi tamamladığında kaydırma işlemini de çözeriz.

Unutmayın, bu temel bir örnektir, bu nedenle kodu istediğiniz tam davranışı temel alarak değiştirmeniz gerekir.