2017-09-14 1 views
0

iMessage Extensionには非常に基本的なビューコントローラがあります。 (もちろん、ビューの拡大)。私はあなたがコンパクトビューでキーボード入力をすることができないことを知っています...iMessage Extension:子ビューコントローラのUITextViewは、スクロール動作に複数の問題があります。

UITextViewは、その上と下にある要素に制約されます。それは設定された高さと幅を持っています。制約はすべて順番になり、壊れません。

インターフェイスビルダーのtextviewのすべてのオプションは、DEFAULTSのままです。

以下の問題がUITextViewで発生:

  1. I編集を開始すると、カーソルはかろうじて見えます。 (フィールドの底部には、垂直方向に半分にカットされています)。

  2. 最初の文字を入力すると、テキストビューの垂直中央にカーソルが移動します。

  3. 改行してから文字を入力すると、カーソルが再び下に戻ります。

  4. その後、次の文字を入力すると、カーソルが再び垂直センターに移動します。他のすべてのキャラクターはテキストビュー全体をもう一度下にスクロールします。だから、あなたはこの変なバウンスをあらゆるキーストロークで上下に振る舞わせる。

  5. スクロールバーの右側のビジュアルヒントは、スクロールするときにテキストビューの適切な高さを反映しません。 (スクロールバーが半分しか道をダウン - テキストビューの高さ。)

私はUITextViewはデフォルトでこのように動作することを期待:

  1. カーソルのTOPに行くべき

    テキスト表示、起動時および編集時。

  2. 改行後にキーを入力するときに、テキストビューがジャンプしてはなりません。

  3. 垂直スクロールバーのインジケータには、テキストフィールドの全範囲が表示され、その半分ではありません。

明らかに、テキストビュー内の内部スクロールビューには、物のサイズがわかるという問題があります。

これはiMessage固有の問題であるか、誰かがこの問題をiMessage以外にも抱えているかどうか、どのように修正するかは誰にも分かりますか?

マイIBの制約(2番目のビューダウンは、テキストビューである):問題の enter image description here

ビデオデモ: https://youtu.be/1bkvHnkXLWM

UPDATE:私は内部の私のビューコントローラを埋め込むために子ビューコントローラを使用していますルートコントローラ。私は空のHello Worldアプリケーションを試しましたが、UITextViewはデフォルトで正常に動作します。したがって、問題は、私が子ビューコントローラを埋め込んでいる方法に関連しています。

これは私が私の子ビューコントローラを埋め込むために使用しているコードです:

- (void)showViewController:(UIViewController*)vcToShow isPop:(BOOL)isPop 
{ 
    NSLog(@"Presenting Controller: %@", vcToShow); 
    [self.activeVC willMoveToParentViewController:nil]; 
    [self addChildViewController:vcToShow]; 

    vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO; 
    vcToShow.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    [self.rootView addControls:@[vcToShow.view] 
    align:VerticalAlignStretchToFullHeight]; 

    UIViewController* currentVC = self.activeVC; 
    self.activeVC = vcToShow; 
    vcToShow.view.alpha = 0.0f; 

    [self transitionFromViewController:currentVC 
     toViewController:vcToShow 
     duration:0.3 
     options:UIViewAnimationOptionTransitionNone 
     animations:^{ 

      vcToShow.view.alpha = 1.0f; 
     } 
     completion:^(BOOL finished) { 
      [currentVC removeFromParentViewController]; 
      [vcToShow didMoveToParentViewController:self]; 
      [self updateScreenState]; 

      if (isPop) { 
       [self removeReferenceToController:currentVC]; 
      } 
     }]; 
} 
+0

を、それがラインかもしれません: ' vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO;'?後で自動サイズ変更マスクを使用していますが、それは 'YES'に設定されていませんか? –

+0

こんにちは。 translatesAutoresizingMaskIntoConstraintsをYESに変更すると、UITextViewに何の影響も与えませんでした。ありがとう。 – Alex

答えて

1

私は解決策を持っています。

UITextViewを配置するためにInterface Builderを使用する代わりに、独自のプログラム制約生成メソッドを使用して、ViewDidAppearの後にUITextViewを作成して配置しました。

私の疑問は、Interface BuilderがChild VCのビューをレンダリングするときに、UITextViewの内部スクロールビューが必要であるとみなされていたということです。そのため、スクロールビューは間違ったディメンション値で初期化されていたため、スクロール関連のものには不具合が発生しました。 viewDidAppear内のすべてを子VCでプログラムで実行すると、テキストビューが正しくスクロールされ、カーソルが常に先頭に移動し、期待どおりに機能します。

更新コード:

  1. は完全インタフェースビルダーからUITextViewを取りました。

  2. は、プログラム(viewDidAppearから呼び出された)、それを追加しました:ちょうど野生の推測

    self.textView = [[UITextView alloc] init]; 
    self.textView.translatesAutoresizingMaskIntoConstraints = NO; 
    
    CGFloat topPadding = self.instructionLabel.frame.origin.y + self.instructionLabel.frame.size.height + TEXT_VIEW_TOP_PADDING; 
    
    // This custom method generates Visual Constraint format for me 
    // so i don't have to write manual individual constraint syntax. 
    [self.rootView addControls:@[self.textView] 
        align:VerticalAlignTop 
        withHeight:TEXT_VIEW_HEIGHT 
        verticalPadding: 0 
        horizontalPadding: 20 
        topPadding: topPadding]; 
    
関連する問題