web-dev-qa-db-ja.com

iOS 7 UITextViewの垂直方向の配置

編集可能なUITextViewUISplitViewのデリゲートとして機能するUITextView内の単純なUIViewController内に配置)が最初からテキストを表示せず、何か後に表示される可能性はありますか6〜7行のように?

Screenshot

私は特定の自動レイアウトなどを設定しませんでした。テキストを削除しようとしても役に立ちません(したがって、隠し文字などはありません)。

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

ここにいくつかのコードがあります。これはViewController 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
}

そして、ここにUITextViewのオーバーライドされた関数があります。StackOverflowで見つけたコードを使用して、ビューのプレースホルダーをシミュレートしています(iPhoneバージョンのストーリーボードと同じものが正常に機能します)...

// 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;
}
27
Napolux

テキストを渡した後、-sizeToFitを呼び出してみてください。この答えは、 ILabel内のテキストを垂直方向に整列させる に役立ちます。
[更新]
この回答を更新し、読みやすくします。
問題は、iOS7から、UINavigationControllerやUITabbarControllerなどのコンテナービューコントローラーがスクロールビュー(またはそれを継承するビュー)のコンテンツインセットを変更して、コンテンツの重複を回避できることです。これは、スクロールビューがメインビューまたは最初のサブビューである場合にのみ発生します。これを回避するには、automaticallyAdjustsScrollViewInsetsをNOに設定するか、このメソッドをオーバーライドしてNOを返すことにより、この動作を無効にする必要があります。

34
Andrea

私は同じ種類の問題を乗り越えました。

自動scrollViewインセット調整を無効にすることで解決しました:

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

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

代わりにcontentInsetを使用して、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
7
Jeff Holliday

-observerForKeyPath KeyPathとともに-contentSizeを使用します

マイブログのコードをご覧ください(タイ語言語に焦点を当てないでください)

http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html

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

Gist here として見つけることができます。

2
Tom Susel

Tanguy.Gの回答の迅速なバージョン:

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

IOS 8.1でも同じ問題が発生しましたが、これらの提案はいずれも機能しませんでした。

did作業は、ストーリーボードに移動し、UITableViewまたはUITextViewをドラッグして、それがなくなるようにすることでした。画面のUIViewの最初のサブビュー。

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

UIViewUINavigationControllerが埋め込まれていることにリンクしているようです。

バグ?バグ? 「バグ」と言いましたか...?

;-)

1
Mike Gledhill

-viewDidLoadのtextViewのトップコンテンツインセットを確認します。

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

ゼロでない場合、ストーリーボードでリセットします

0
LorikMalorik