2017-09-14 42 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];