0

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

这是我在 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

4 回答 4

10

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

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

于 2013-10-01T12:34:01.310 回答
1

我遇到了与urs类似的情况。我的显示有不同的错误,但由于相同的原因: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中的错误。希望苹果能尽快修复它。希望这会有所帮助。

于 2013-10-01T09:59:51.090 回答
0

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

于 2013-10-01T09:35:50.067 回答
0

UITextView 也有这个问题,我不能依赖 contentSize 提供正确的值来调整我的 textView 的大小,也不能在 textView 上调用 layoutIfNeeded 来帮助我获得正确的值。所以为了解决这个问题,我使用 sizeThatFits 而不是 sizeWithFont 来计算 UITextView contentSize。SizeWithFont 有一些细微的差异,sizeThatFits 更适合用于 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 中无法正确更新。

于 2013-10-09T20:46:19.003 回答