UITextview文本在iOS7中旋转后不显示顶行

时间:2014-01-16 17:08:34

标签: ios7 uitextview autolayout ios7.1

我有一个包含显示静态文本的UITextview的应用。我使用UITextview来滚动文本,这比UILabel中显示的要长得多。出于某种原因,iOS 7下的UITextview中的文本在旋转后不会保持滚动到顶部。在iOS 6下运行时,这可以正常工作。

这可以通过创建一个UITextview项目来显示,该项目以故事板为中心,边距约为50.然后添加将UITextview固定到主视图边缘的约束。确保文本字段包含足够的文本以进行滚动:

enter image description here

现在运行应用程序,文本将正确定位在UITextview中,第一行显示在顶部。旋转后,文本将向下移动:

enter image description here

旋转回肖像后,文本仍然向下滚动几行。

如果你在iOS 6中运行它,所有这些都能很好地工作。我已经尝试过很多研究,并在viewWillLayoutSubviews中尝试了以下可能的解决方案,使文本保持原位:

[textView sizeToFit];
[textView layoutIfNeeded];

[textView setContentOffset:CGPointMake(0.0, 0.0)];

[textView scrollRectToVisible:CGRectMake(0.0, 0.0, 1.0, 1.0) animated:NO];

似乎没什么用。有谁知道如何保持文本的位置?

5 个答案:

答案 0 :(得分:1)

试试这个:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self.textView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
}

我在iOS 7.1上测试了这个。

答案 1 :(得分:1)

从委托视图控制器的viewDidLayoutSubviews通知方法调用UITextView的scrollRangeToVisible:消息。这将在旋转后以及第一次印象时调整范围。

-(void)viewDidLayoutSubviews {

    [self scrollToTop];
}

-(void) scrollToTop {
    [self.textView setScrollEnabled:NO];
    [self.textView scrollRangeToVisible:NSMakeRange(0.0f, 0.0f)];
    [self.textView setScrollEnabled:YES];
}

答案 2 :(得分:0)

我有同样的问题。看起来像在故事板中使用UITextView会产生许多小烦人的错误(如this)。我设法通过编程方式创建UITextView来解决问题:

-(void) viewDidLoad{
    self.textView=[[UITextView alloc] init];
    self.textView.translatesAutoresizingMaskIntoConstraints=NO;
    [self.view addSubview:self.textView];

    NSDictionary* views = @{@"textView": self.textView};
    NSArray* vContrains=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[textView]-50-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:views];
    NSArray* hContrains=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[textView]-50-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:views];
    [self.view addConstraints:vContrains];
    [self.view addConstraints:hContrains];

}
-(void)viewWillLayoutSubviews{
   [self.textView layoutIfNeeded];
   [self.textView sizeToFit];
}

答案 3 :(得分:0)

在iOS 8上试过这个。

INSERT INTO appointment VALUES(  000000001, 123456789,
  ‘2008-09-27 09:12:47’, '22-JUN-1964’,  00001, 123000000);
  ^                   ^              ^

答案 4 :(得分:0)

类似于上面的一些内容:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  self.textView.scrollRectToVisible(CGRect(x:0,y:0,width:1,height:1),animated: false)
  self.textView.layoutIfNeeded()
  self.textView.sizeToFit()
}
相关问题