27

我的可编辑文件UITextView(放置在一个简单的 UIViewController 内UISplitView,作为 的委托UITextView)没有从一开始就显示文本,而是在 6-7 行之后显示文本,这怎么可能?

截屏

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

我在 iPad 上使用 iOS 7,在情节提要中看起来不错...... iOS 模拟器和真实设备上的问题是一样的。我要生气了:P

这是一些代码。这是视图控制器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;
}
4

8 回答 8

34

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

于 2013-10-19T16:44:46.393 回答
15

我解决了同样的问题。

通过禁用自动滚动视图插入调整来解决它:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){
    self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?)
}
于 2013-11-10T14:05:37.620 回答
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
于 2014-07-21T17:54:51.047 回答
4

使用 -observerForKeyPathcontentSizeKeyPath

在我的博客上查看一些代码(不要专注于泰语

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

于 2013-11-10T14:44:35.490 回答
2

受 Kiattisak 的启发,我将垂直对齐实现为一个类别,UITextView以便您可以控制legacy的垂直UITextView对齐。

您可以在这里找到它作为要点

于 2014-01-09T06:56:06.060 回答
1

我在 iOS 8.1 上遇到了同样的问题,但这些建议都没有奏效。

起作用的是进入情节提要,并拖动我的左右UITableView使其UITextView不再是我屏幕的第一个子视图UIView

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

它似乎与UIView嵌入在UINavigationController.

漏洞 ?漏洞 ?我说“错误”...?

;-)

于 2014-12-23T15:15:59.357 回答
1

Tanguy.G 的 Swift 版本的回答:

if(UIDevice.currentDevice().systemVersion >= "7.0") {
            self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?)
  }
于 2015-09-20T00:06:05.900 回答
0

检查 textView 的顶部内容插图-viewDidLoad

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

如果它不为零,请在情节提要中重置它

于 2013-10-19T17:15:16.490 回答