在调用viewDidAppear方法之前,IOS7获取UITextView contentSize?

时间:2013-09-26 16:10:25

标签: ios ios6 uitextview ios7 viewwillappear

我正在将我的应用程序从iOS6升级到iOS7,我的UIViewControllers布局遇到了一些问题。在iOS6中,我能够通过获取textView的contentSize属性然后设置其frame属性来动态调整我的UITextViews的大小。我会在viewWillAppear方法中进行所有大小调整,以便在可见之前调整视图的大小。现在在iOS7中它不起作用。如果我在viewDidAppear方法中设置,则contentSize属性的唯一工作方式。我讨厌这样做,因为它会导致视图在已经可见之后跳转。有没有人想出如何解决这个问题?

以下是我的代码在iOS7中不再有效:

-(void)viewWillAppear:(BOOL)animated
{
    self.textView = [[UITextView alloc]initWithFrame:CGRectMake(5, 0, 310, 0)];
    self.textView.text = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
    [self.view addSubview:self.textView];

    CGRect textViewframe;
    textViewframe = self.textView.frame;
    textViewframe.size.height = [self.textView contentSize].height;
    self.textView.frame = textViewframe;
}

4 个答案:

答案 0 :(得分:10)

您可以在使用适当的框架创建[self.textView layoutIfNeeded]之后调用它(因此它可以找出其最大宽度),然后contentSize应该代表内容。

另外:如果textView定义为weak,则文本视图将在下一行中消失(因为ARC添加了一个版本,优化程序将其移动)。他们在WWDC期间宣布了针对Debug(-O0)构建的这种优化更改。

答案 1 :(得分:1)

我遇到了与她相似的情况。我的节目有不同的错误,但由于同样的原因:iOS7不正确地默默地更改了contentSize属性。 这是我如何解决它。它有点难看。 每当我需要使用textView.contentSize时,我自己计算它。

-(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font
{
    CGSize size = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    return size;
}

然后你可以调用这个函数来获得大小:

CGSize cont_size =   [self sizeOfText:self.text widthOfTextView:self.frame.size.width withFont:[UIFont systemFontOfSize:15]];

然后,不要执行以下操作:

self.contentSize = cont_size;// it causes iOS halt occasionally.

所以,直接使用cont_size。 我相信它现在是iOS7中的错误。希望苹果能尽快修复它。 希望这有用。

答案 2 :(得分:0)

我们对表格视图有同样的问题。更糟糕的是,转移到像ViewDidAppear这样的后续生命周期调用可能会恶化用户体验(从性能的角度来看)。我们尝试拆分代码并仅在ViewWillAppear中执行内容大小设置。但是UI问题仍然存在。

答案 3 :(得分:0)

也有UITextView的这个问题,我不能依赖contentSize提供正确的值来调整textView的大小,也不会在textView上调用layoutIfNeeded来帮助我获得正确的值。所以要解决它,我使用sizeThatFits而不是sizeWithFont来计算UITextView contentSize。 SizeWithFont有一些微妙的差异和大小使用UITextViews更适合使用,请参阅UITableViewCell with UITextView height in iOS 7?

所以我的解决方案看起来更像:

UITextView* sizingView      = [[UITextView alloc] initWithFrame:textView.frame];
sizingView.attributedText   = textView.attributedText;
CGSize contentSize          = [sizingView sizeThatFits:CGSizeMake(sizingView.frame.size.width, FLT_MAX)];

如果您注意到,我创建了一个新的UITextView,复制了属性文本,并获得了内容大小,因为遗憾的是,sizeThatFits有一些令人讨厌的副作用,可能导致textView无法在iOS 7.0中正确更新。