5

我一直在UITextView以编程方式创建 s,在 iOS 7 中使用自动布局。像这样:

_textView = [UITextView new];
_textView.translatesAutoresizingMaskIntoConstraints = NO;
_textView.font = [UIFont systemFontOfSize:18.0];
_textView.delegate = self;
[self.view addSubview:_textView];

除了我创建的其他约束之外,我在文本视图的底部还有一个:

_textViewBottomConstraint = 
       [NSLayoutConstraint constraintWithItem:_textView
                                                     attribute:NSLayoutAttributeBottom
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:self.bottomLayoutGuide
                                                     attribute:NSLayoutAttributeTop
                                                    multiplier:1.0
                                                      constant:0.0];

[self.view addConstraint:_textViewBottomConstraint];

这样我就可以在键盘显示时更改约束:

- (void)keyboardDidShow:(NSNotification*)sender
{
    CGRect keyboardFrame = 
                        [sender.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect convertedFrame = 
                        [self.view convertRect:keyboardFrame fromView:self.view.window];
    _textViewBottomConstraint.constant = -convertedFrame.size.height;
    [_textView layoutIfNeeded];
}

这一切都很好......

问题

我刚刚切换到 Xcode 6 和 iOS 8(我知道晚了) -UITextView现在里面的文本在顶部有一个插图。例如(文本视图背景为黄色):

在此处输入图像描述

是什么导致了插入?它与NSTextContainer和相连textContainerInset吗?

  • 从 iOS 7 及更高版本开始使用NSTextContainer正确textContainerInset的使用方式?UITextView
  • 在 iOS 8 中是否必须这样做?

如果是的话,我将不胜感激以编程方式创建 aUITextView以及必要的NSTextContainerand的一些指导NSLayoutManager;然后设置textContainerInset. (我将以编程方式使用自动布局)。

谢谢。

4

2 回答 2

9

我认为 automaticAdjustsScrollViewInsets 在 iOS 8 中的工作方式略有不同。在 7 中,它仅适用于控制器的视图属性是滚动视图的情况。在 8 中,它似乎适用于作为控制器视图子视图的滚动视图。

于 2014-09-16T20:44:03.853 回答
7

contentInsetUIViewController.

似乎在 iOS 8 中,由于 myUITextView位于 myUIViewController中,因此需要明确设置:

self.automaticallyAdjustsScrollViewInsets = NO;

在没有明确设置的情况下,我检查了运行 iOS 7 的物理 iPhone 5s 和运行 iOS 8 的模拟器 iPhone 5s 之间的区别。

textContainerInset这是一些日志输出,检查 和 的contentInset最大值scrollIndicatorInset。在每种情况下,在viewDidLoad和之后keyboardDidShow

运行 iOS 7 的 iPhone 5s 设备

2014-09-12 07:55:01.244 Alter[19147:60b] viewDidLoad
2014-09-12 07:55:01.249 Alter[19147:60b] textContainerInset Top: 8.000000
2014-09-12 07:55:01.252 Alter[19147:60b] contentInset Top: 0.000000
2014-09-12 07:55:01.253 Alter[19147:60b] scrollIndicatorInset Top: 0.000000

2014-09-12 07:55:02.515 Alter[19147:60b] keyboardDidShow
2014-09-12 07:55:02.516 Alter[19147:60b] textContainerInset Top: 8.000000
2014-09-12 07:55:02.516 Alter[19147:60b] contentInset Top: 0.000000
2014-09-12 07:55:02.516 Alter[19147:60b] scrollIndicatorInset Top: 0.000000

运行 iOS 8 的模拟器 iPhone 5s(或 6 或 6 Plus)

2014-09-12 07:55:39.395 Alter[2120:109535] viewDidLoad
2014-09-12 07:55:39.395 Alter[2120:109535] textContainerInset Top: 8.000000
2014-09-12 07:55:39.396 Alter[2120:109535] contentInset Top: 0.000000
2014-09-12 07:55:39.396 Alter[2120:109535] scrollIndicatorInset Top: 0.000000

2014-09-12 07:55:39.939 Alter[2120:109535] keyboardDidShow
2014-09-12 07:55:39.939 Alter[2120:109535] textContainerInset Top: 8.000000
2014-09-12 07:55:39.939 Alter[2120:109535] contentInset Top: 64.000000
2014-09-12 07:55:39.939 Alter[2120:109535] scrollIndicatorInset Top: 64.000000

要回答我自己的问题,我不需要手动设置NSTextContainerNSLayoutManager. 虽然开始使用该textContainerInset方法可能会更好,但如果我在父视图控制器中设置它,我可以选择调整框架:

self.automaticallyAdjustsScrollViewInsets = NO;
于 2014-09-12T07:13:18.793 回答