2017-09-14 43 views
0

我在iMessage擴展中有一個非常基本的視圖控制器。 (當然放大視圖)。我知道你不能有緊湊的視圖鍵盤輸入...iMessage擴展:子視圖控制器中的UITextView,滾動行爲有多個問題

UITextView被限制在它上面的元素,並在它下面。它有一個高度和寬度。約束都是按順序的,並沒有被破壞。

界面構建器中textview的所有選項都保留爲DEFAULTS。與UITextView的發生

以下問題:

  1. 當我開始編輯,光標幾乎不可見。 (在場地的底部,垂直切斷一半)。

  2. 鍵入第一個字母會將光標移動到文本視圖的垂直中心。

  3. 放入一個新行然後是一個字符,將光標放回原位。

  4. 然後在後面輸入後續字符會將光標重新帶到垂直中心。而其他所有角色再次將整個文本視圖滾動到底部。所以你在每次擊鍵時都會出現這種奇怪的反彈行爲。

  5. 當我滾動時,右側的滾動條視覺提示並不反映文本視圖的正確高度。 (滾動條僅下降了一半 - 文本視圖的高度。)

我期待的UITextView在默認情況下是這樣工作的:

  1. 光標應該去的頂部文本視圖,當激活和編輯。

  2. 在新行後輸入鍵時,文本視圖不應該跳轉。

  3. 垂直滾動條指示器應顯示文本字段的全部範圍,而不是其中的一半。

所以,顯然文本視圖內部的滾動視圖有一個問題,找出事物的大小。

有誰知道,如果這是一個iMessage特定問題,或者是否有人在iMessage之外也有這個問題,以及如何解決?

我的IB約束(第二種觀點下是文本視圖): 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;'?您稍後使用自動調整大小的掩碼,是不是應該設置爲「是」? –

+0

嗨。將更改TransAutoresizingMaskIntoConstraints更改爲YES,對UITextView沒有任何影響。謝謝。 – Alex

回答

1

我有一個解決辦法。

我沒有使用Interface Builder來放置我的UITextView,而是使用我自己的編程約束生成方法來創建和放置UITextView,只能在ViewDidAppear之後。

我的懷疑是,當Interface Builder呈現Child VC的視圖時,它沒有填充UITextView內部滾動視圖所需的所有內容。所以滾動視圖被初始化爲具有錯誤的維度值,因此會滾動相關的任何東西。以編程方式完成viewDidAppear後(在Child 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];