【问题标题】:iMessage Extension: UITextView in Child View Controller, scrolling behaviour has multiple issuesiMessage 扩展:子视图控制器中的 UITextView,滚动行为有多个问题
【发布时间】:2018-02-23 13:29:44
【问题描述】:

我在 iMessage 扩展中有一个非常基本的视图控制器。 (当然是扩展视图)。我知道您不能在紧凑视图中使用键盘输入...

UITextView 被限制在它上面和下面的 Element。它有一个固定的高度和宽度。约束都是有序的,没有被破坏。

界面生成器中文本视图上的所有选项都保留为默认值。

UITextView 出现以下问题:

  1. 当我开始编辑时,光标几乎看不到。 (在场地底部,垂直切断一半)。

  2. 键入第一个字母会将光标带到文本视图的垂直中心。

  3. 输入一个新行,然后输入一个字符,将光标再次放回下方。

  4. 然后键入后续字符会将光标再次带到垂直中心。并且每个其他字符再次将整个文本视图滚动到底部。因此,每次击键都会出现这种奇怪的上下弹跳行为。

  5. 当我滚动时,右侧的滚动条视觉提示无法反映文本视图的正确高度。 (滚动条只下降到文本视图高度的一半。)

我希望 UITextView 默认可以这样工作:

  1. 当激活和编辑时,光标应该转到文本视图的顶部。

  2. 在换行后键入键时,文本视图不应跳转。

  3. 垂直滚动条指示器应该显示整个文本字段,而不是一半。

所以,显然 Text View 内部的 Scroll View 在确定事物的大小时存在问题。

有谁知道,如果这是 iMessage 特定问题,或者是否有人在 iMessage 之外也遇到过这个问题,以及如何解决?

我的 IB 约束(第二个视图是文本视图):

问题的视频演示: https://youtu.be/1bkvHnkXLWM

更新:我正在使用子视图控制器将我的视图控制器嵌入到根控制器中。我尝试了一个空白的 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];
            }
        }];
}

【问题讨论】:

  • 只是一个疯狂的猜测,但可能是以下行:` vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO;? you are using autoresizing mask later, is that not supposed to be set to YES`?
  • 嗨。将 translatesAutoresizingMaskIntoConstraints 更改为 YES,对 UITextView 没有任何影响。谢谢。

标签: ios iphone uiscrollview uitextview imessage-extension


【解决方案1】:

我有一个解决方案。

我没有使用 Interface Builder 来放置我的 UITextView,而是使用我自己的编程约束生成方法来创建和放置 UITextView,仅在 ViewDidAppear 之后。

我的怀疑是,在界面构建器呈现子 VC 的视图时,它并没有填充 UITextView 的内部滚动视图所需的所有内容。所以滚动视图用错误的维度值初始化,因此会在任何与滚动相关的东西上出现故障。以编程方式(在子 VC 中)在 viewDidAppear 中完成所有操作后,文本视图现在可以正确滚动,并且光标始终位于开头,按预期工作。

更新代码:

  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];
    

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多