iOS 7 UITextView垂直alignment

这是怎么可能的,我的可编辑UITextView (放在一个简单的UIViewController内的一个UISplitView作为UITextView委托)是不是从开始显示文本,但像6-7线之后?

截图

我没有设置任何特定的自动布局或类似的东西,试图删除文字没有帮助(所以没有隐藏的字符或东西)。

我在iPad上使用iOS 7,故事板看起来不错…在iOS模拟器和真实设备上的问题是一样的。 我生气了:P

这是一些代码。 这是ViewController的viewDidLoad()

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.itemTextField.delegate = self; self.itemTextField.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); self.itemTextField.textColor = [UIColor lightGrayColor]; //optional } 

这里是重写的函数为UITextView我正在使用一些代码,我已经发现在StackOverflow模拟一个占位符的视图(相同的东西在iPhone版的故事板工作正常)…

 // UITextView placeholder - (void)textViewDidBeginEditing:(UITextView *)textView { if ([textView.text isEqualToString:NSLocalizedString(@"NEWITEMPLACEHOLDER", nil)]) { textView.text = @""; textView.textColor = [UIColor blackColor]; //optional } [textView becomeFirstResponder]; } - (void)textViewDidEndEditing:(UITextView *)textView { if ([textView.text isEqualToString:@""]) { textView.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); textView.textColor = [UIColor lightGrayColor]; //optional } [textView resignFirstResponder]; } -(void)textViewDidChange:(UITextView *)textView { int len = textView.text.length; charCount.text = [NSString stringWithFormat:@"%@: %i", NSLocalizedString(@"CHARCOUNT", nil),len]; } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { return YES; } 

尝试在传递文本后调用-sizeToFit 。 这个答案可以用来在UILabel中垂直排列文本 。
[UPDATE]
我更新这个答案,使其更具可读性。
问题是,在iOS7中,容器视图控制器(如UINavigationController或UITabbarController)可以更改滚动视图(或从中inheritance的视图)的内容插入,以避免内容重叠。 只有当scrollview是主视图或第一个子视图时才会发生这种情况。 为了避免这种情况,应该通过将automaticallyAdjustsScrollViewInsets调整滚动视图集设置为NO来禁用此行为,或者覆盖此方法以返回NO。

我通过了同样的问题。

通过禁用自动scrollView insets adjustement来解决它:

 if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){ self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?) } 

这是一个相当普遍的问题,所以我会创build一个简单的UITextView子类,以便您可以重新使用它并在IB中使用它。

我会使用contentInset来代替,确保处理contentSize大于textView边界的情况

 @interface BSVerticallyCenteredTextView : UITextView @end @implementation BSVerticallyCenteredTextView - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { [self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL]; } return self; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"contentSize"]) { UITextView *tv = object; CGFloat deadSpace = ([tv bounds].size.height - [tv contentSize].height); CGFloat inset = MAX(0, deadSpace/2.0); tv.contentInset = UIEdgeInsetsMake(inset, tv.contentInset.left, inset, tv.contentInset.right); } } - (void)dealloc { [self removeObserver:self forKeyPath:@"contentSize"]; } @end 

使用带“contentSize”KeyPath的-observerForKeyPath

在“我的博客”中查看一些代码(不要关注泰语)

http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html

受到Kiattisak的启发,我已经在UITextView上实现了垂直alignment作为一个类别,以便您可以控制传统UITextView的垂直alignment。

你可以在这里find它的要点 。

我有与iOS 8.1相同的问题,并没有任何这些build议的工作。

什么工作是进入故事板,并拖动我的UITableViewUITextView ,使其不再是我的屏幕的UIView的第一个子视图。

http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView

它似乎与UINavigationControllerembedded的UIView相关联。

错误? 错误? 我说过“臭虫”吗?

😉

Swift版Tanguy.G的回答:

 if(UIDevice.currentDevice().systemVersion >= "7.0") { self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?) } 

-viewDidLoad检查-viewDidLoad顶部内容插入:

 NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset)); 

如果它不是零,则在故事板中重置它