NavigationBar 半透明改变 UITextView 文字位置

Posted

技术标签:

【中文标题】NavigationBar 半透明改变 UITextView 文字位置【英文标题】:NavigationBar translucent changes UITextView text position 【发布时间】:2017-08-07 12:59:51 【问题描述】:

我有一个 UITextView 将其内容定位在错误的位置。我一输入文字,文字就变得不可见,然后很快就跳到正确的位置(几乎正确的位置,比我预期的略低)。

查看调试时,我可以看到 _UITextContainerView 的位置错误。

奇怪的是,当我将 NavigationBar 外观设置为 NO 时, 一切都按预期工作,完全没有问题。

UINavigationBar.appearance.translucent = YES;

我必须设置我的 mainView 的边界,否则它不会低于 “导航栏”

    if (self.navigationController.navigationBar.isTranslucent) 
        [[self view] addConstraint:[NSLayoutConstraint constraintWithItem:_mainView
                                                                attribute:NSLayoutAttributeTop
                                                                relatedBy:NSLayoutRelationEqual
                                                                   toItem:self.view
                                                                attribute:NSLayoutAttributeTop
                                                               multiplier:1.0
                                                                 constant:64]];
     else 
        [[self view] addConstraint:[NSLayoutConstraint constraintWithItem:_mainView
                                                                attribute:NSLayoutAttributeTop
                                                                relatedBy:NSLayoutRelationEqual
                                                                   toItem:self.view
                                                                attribute:NSLayoutAttributeTop
                                                               multiplier:1.0
                                                                 constant:0]];
    

在我输入文字之前:

Text输入后,_UITextContainerView向下移动,可以看到 “_UITextContainerView”视图中间的光标,一个很小的 更垂直的矩形。

刚刚找到更多信息,可能与我的问题有关, 我的边界与框架不匹配。仍然不知道如何解决这个问题。 我认为这是相关的,从 4 到 -56 = 60 的距离,高度 导航栏。

再次提供更多信息:

我在TextField上设置了字体大小,并在减小字体大小后 我注意到不同的结果,如图所示。

通过关闭半透明进行了测试,所有(0,1,2,3 个字符)在减小字体大小的情况下都很完美。

字体更改结果见图片:

_textField = [UITextView new];
_textField.bounds = CGRectZero;
_textField.backgroundColor = [UIColor whiteColor];    
_textField.layer.cornerRadius = 16;
_textField.layer.borderWidth = 0.5;
_textField.font = [UIFont systemFontOfSize:17.0]; //<< problematic???

【问题讨论】:

你为什么使用self.view作为superview和toitem:self.view。但是你的设计看起来像是有UITextView superview 而不是self.view。也许这个问题是由约束发生的。删除“UITextView”的滚动启用。 (仅供参考) mainView 在 self.view 里面,StoryBoard 给你的那个。我的 UITextView 没有滚动。 【参考方案1】:

如果将navigationBar 的半透明设置为YES,self.view 的原点位置将从屏幕的左上角开始。如果设置为 NO,则从栏的左下角开始。

【讨论】:

谢谢您的信息。这就是为什么我有不同的约束,无论何时打开半透明。仍然不确定为什么我的 UIText 视图正在改变它的方式。【参考方案2】:

最后在尝试了几件事后,我发现通过添加这个 我的 viewDidLoad 方法的行解决了这个问题。

    self.automaticallyAdjustsScrollViewInsets = NO;

一个布尔值,指示视图控制器是否应自动调整其滚动视图插图。 此属性的默认值为 YES,它让容器视图控制器知道他们应该调整此视图控制器视图的滚动视图插图,以考虑状态栏、搜索栏、导航所占用的屏幕区域栏、工具栏或标签栏。 如果您的视图控制器实现管理自己的滚动视图插入调整,请将此属性设置为 NO。

【讨论】:

以上是关于NavigationBar 半透明改变 UITextView 文字位置的主要内容,如果未能解决你的问题,请参考以下文章

在iOS7半透明导航栏中获取正确的颜色

iOS - 导航栏设置半透明或取消半透明

透明导航栏不起作用(呈半透明蓝色)

iPhone:UITabBarController 内的半透明导航栏

iOS Swift 4 状态栏 - 禁用半透明

IOS - 内容上的半透明导航栏