iOS 7 UITextView垂直对齐

Nap*_*lux 27 objective-c vertical-alignment uitextview ipad ios

怎么可能我的editable UITextView(放在一个直接的UIViewController里面UISplitView作为委托UITextView)不是从头开始显示文本但是在6-7行之后?

截图

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

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

这是一些代码.这是ViewControllerviewDidLoad()

- (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
}
Run Code Online (Sandbox Code Playgroud)

以下是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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*rea 34

-sizeToFit传递文本后尝试调用.此答案可用于垂直对齐UILabel中的文本.
[更新]
我更新这个答案o使其更具可读性.
问题是,从iOS7,容器视图控制器(如UINavigationController或UITabbarController)可以更改滚动视图(或从其继承的视图)的内容插入,以避免内容重叠.仅当scrollview是主视图或第一个子视图时才会发生这种情况.要避免这种情况,您应该通过设置automaticallyAdjustsScrollViewInsets为NO来禁用此行为,或者重写此方法以返回NO.

  • 好吧,也许lorik指出我正确的方向.插图是由于UITextField具有scrool功能,因为iOS7在sotryboard中的每种scrollview都会自动插入statusbar + navbar(在UINavController中)的大小.可能在这里你在顶部设置了一个约束,它修复了"顶部距离",但你没有取消选择自动边缘选项.因此,请检查此VC的故事板并取消选择adjust scroll view insets选项. (8认同)

Tan*_* G. 15

我遇到了同样的问题.

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

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


Jef*_*day 7

这是一个相当常见的问题,因此我将创建一个简单的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
Run Code Online (Sandbox Code Playgroud)