2013-10-19 20 views
26

UITextViewUITextViewUITextViewの代理人として機能するUISplitViewの中のわかりやすいUIViewControllerの中に配置されています)は、どのようにテキストが最初から表示されていませんか?iOS 7 UITextViewの垂直配置

Screenshot

私は(そういない隠された文字か何か)は役立ちませんテキストを削除しようとすると、任意の特定の自動レイアウトまたは類似した何かを設定しませんでした。

iPadでiOS 7を使用していますが、ストーリーボードはうまくいきます... 問題はiOSシミュレータと実際のデバイスで同じです。私は怒っている:P

ここにいくつかのコードがあります。これはviewDidLoad()

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.itemTextField.delegate = self; 
    self.itemTextField.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); 
    self.itemTextField.textColor = [UIColor lightGrayColor]; //optional 
} 

そして、ここでは、I(ストーリーボードのiPhone版でも同じものをビューのプレースホルダをシミュレートするために、私はStackOverflowの上で見つけたいくつかのコードを使用していUITextViewためオーバーライドされた機能ですがViewControllerです...)

// UITextView placeholder 
- (void)textViewDidBeginEditing:(UITextView *)textView 
{ 
    if ([textView.text isEqualToString:NSLocalizedString(@"NEWITEMPLACEHOLDER", nil)]) { 
     textView.text = @""; 
     textView.textColor = [UIColor blackColor]; //optional 
    } 
    [textView becomeFirstResponder]; 
} 

- (void)textViewDidEndEditing:(UITextView *)textView 
{ 
    if ([textView.text isEqualToString:@""]) { 
     textView.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); 
     textView.textColor = [UIColor lightGrayColor]; //optional 
    } 
    [textView resignFirstResponder]; 
} 

-(void)textViewDidChange:(UITextView *)textView 
{ 
    int len = textView.text.length; 
    charCount.text = [NSString stringWithFormat:@"%@: %i", NSLocalizedString(@"CHARCOUNT", nil),len]; 
} 

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 
    return YES; 
} 
+0

水色がUITextVIewの背景色ですか? –

+0

はい、私はスクリーンショットで明確にするためにストーリーボードに設定しました。ちなみに、問題はデフォルトの背景色でさえあります。 – Napolux

+0

これは、元の質問から大きく変更されています。これは、「UITextViewをどのように垂直に配置できますか?」でした。 –

答えて

33

テキストを渡した後に-sizeToFitに電話してみてください。この回答はVertically align text within a UILabelに役立ちます。
[更新日]
私はこの答えを更新します。より読みやすくしてください。
UINavigationControllerやUITabbarControllerなどのコンテナビューコントローラは、iOS7からスクロールビュー(またはそれを継承するビュー)のコンテンツインセットを変更して、コンテンツの重複を避けることができます。これは、スクロールビューがメインビューまたは最初のサブビューである場合にのみ発生します。この現象を回避するには、automaticallyAdjustsScrollViewInsetsをNOに設定するか、このメソッドを無効にしてNOを返すようにします。 -viewDidLoad中のTextViewの

+0

動作しません。 'UITextView'は30 x 20ピクセルのようなものにリサイズされ、テキストは表示されません。 – Napolux

+0

属性付き文字列を使用していますか? – Andrea

+0

プレーンテキスト。質問にいくつかのコードを追加してみましょう。 :) – Napolux

0

チェックトップコンテンツのインセット:それは私は問題の同じ種類によって持っていないゼロ

+0

NSStringFromUIEdgeInsets(self.itemTextField.contentInset)= {0、0、0、0} ' いいえ、運がありません。 – Napolux

+1

ログ 'self.itemTextField.contentOffset' – LorikMalorik

+0

self.itemTextField.contentOffset = null – Napolux

15

ある場合

NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset)); 

はストーリーボードにそれをリセットします。

は自動scrollViewインセットのadjustement無効にすることで、それを解決:キーパス

は(タイ語に焦点を当てていない)私のブログにいくつかのコードを見て "contentSize" と

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){ 
    self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?) 
} 
+0

ありがとう!これは、同様のストーリーボードのプロパティの "コード方法"です! – Napolux

+0

合意。これは問題を解決するためのコードです。 – t9mike

2

Kiattisakに触発された私は、UITextViewのカテゴリとして垂直方向の配置を実装しました。レガシーUITextViewの垂直方向の配置を制御します。

gist hereと表示されます。

+1

VCが割り当て解除されたときにキー値オブザーバを必ず削除してください。 – iwasrobbed

+0

ありがとうございました@iWasRobbed、gistが更新されました。 –

7

これはかなり一般的な問題ですので、簡単なUITextViewサブクラスを作成して、再利用してIBで使用できるようにします。

私は同じのiOS 8.1での問題、およびこれらの提案のどれを持っていた優雅contentSizeがTextViewの

@interface BSVerticallyCenteredTextView : UITextView 

@end 

@implementation BSVerticallyCenteredTextView 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     [self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super initWithCoder:aDecoder]) 
    { 
     [self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL]; 
    } 
    return self; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"contentSize"]) 
    { 
     UITextView *tv = object; 
     CGFloat deadSpace = ([tv bounds].size.height - [tv contentSize].height); 
     CGFloat inset = MAX(0, deadSpace/2.0); 
     tv.contentInset = UIEdgeInsetsMake(inset, tv.contentInset.left, inset, tv.contentInset.right); 
    } 
} 

- (void)dealloc 
{ 
    [self removeObserver:self forKeyPath:@"contentSize"]; 
} 

@end 
1

の範囲よりも大きい場合を扱うことを確認して、代わりにcontentInsetを使用します働いた。仕事をやった

は、ストーリーボードに行き、それはもはや私の画面のUIViewの最初のサブビューになるように、私のUITableViewまたはUITextViewをドラッグしていないことでした。

http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView

UINavigationControllerに埋め込まれUIViewを持つにリンクしているようです。

バグ?バグ?私は「バグ」と言ったのですか?

;-)

1

Tanguy.Gの答えのスウィフトバージョン:

if(UIDevice.currentDevice().systemVersion >= "7.0") { 
      self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?) 
    } 
+0

また、レイアウト: 'view.layoutIfNeeded()'を頻繁に呼び出さなければならないことに注意してください。それは非常に迷惑で、例外的に悪いことにiOSで行われます。 – Fattie

関連する問題