我已经在iOS 7中使用自动布局以编程方式创建了UITextView
。像这样:
_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
?
NSTextContainer
和textContainerInset
正确的方式在iOS 7及更高版本中使用UITextView
吗?如果是,我非常感谢您以编程方式创建UITextView
以及必要的NSTextContainer
和NSLayoutManager
的一些指导;然后设置textContainerInset
。 (我将以编程方式使用自动布局。)
感谢。
答案 0 :(得分:9)
我认为在iOS 8中,automaticAdjustsScrollViewInsets的工作方式略有不同。在7中,它仅在控制器的view属性为scrollView时应用。在8中,它似乎适用于作为控制器视图的子视图的滚动视图。
答案 1 :(得分:7)
来自contentInset
的{{1}}。
对于iOS 8,我的UIViewController
内的UITextView
似乎需要明确设置:
UIViewController
如果没有明确说明,我已经检查了运行iOS 7的物理iPhone 5和运行iOS 8的Simulator iPhone 5s之间的区别。
以下是一些日志输出,检查self.automaticallyAdjustsScrollViewInsets = NO;
,textContainerInset
和contentInset
的最高值。在每种情况下,在scrollIndicatorInset
和viewDidLoad
之后。
运行iOS 7的iPhone 5s设备:
keyboardDidShow
运行iOS 8的模拟器iPhone 5s(或6或6 Plus):
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
要回答我自己的问题,我不会需要来手动设置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
和NSTextContainer
。虽然开始使用NSLayoutManager
方法可能会更好,但如果我在父视图控制器中设置它,我可以选择调整框架:
textContainerInset