【问题标题】:Resizing UIView based on content根据内容调整 UIView 的大小
【发布时间】:2012-02-09 21:00:21
【问题描述】:

我有一个视图,其中很多标签都填充了解析的 XML。该视图位于 UIScrollView 中。一些 XML 对于标签来说太长了。我正在根据 XML 内容调整标签的大小。当标签调整大小时,它们与后续标签重叠,因为我的 UIView(即在 UIScrollView 内)没有调整大小。我已经在互联网上搜索了好几个小时,试图找到这个问题的答案,但是我尝试过的一切都没有达到我想要的。任何帮助将不胜感激。

这是我的 populateLabels 方法。

-(void) populateLabels {

NSString *noInfo = (@"No Information Available");
lblCgName.text = _Campground.campground;
NSString *cgLoc = _Campground.street1; 
NSString *cgCity = _Campground.city;
NSString *cgState = _Campground.state1;
NSString *cgCountry = _Campground.country;
NSString *cgZipPostal = _Campground.zipPostal;
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgCity];
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgState];
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgCountry];
cgLoc = [[cgLoc stringByAppendingString:@" "] stringByAppendingString:cgZipPostal];
lblCgLoc.text = cgLoc;
double dRate = [_Campground.regRate1 doubleValue];
double dRate2 = [_Campground.regRate2 doubleValue];
NSString *rate = [[NSString alloc] initWithFormat:@"$%0.2f",dRate];
NSString *rate2 = [[NSString alloc] initWithFormat:@"$%0.2f",dRate2];
if ([rate2 isEqualToString:@"$0.00"]) {
    lblRate.text = rate;
} else {
    rate = [[rate stringByAppendingString:@" - "] stringByAppendingString:rate2];
    lblRate.text = rate;
}
double dPaRate = [_Campground.paRate1 doubleValue];
double dPaRate2 = [_Campground.paRate2 doubleValue];
NSString *paRate = [[NSString alloc] initWithFormat:@"$%0.2f",dPaRate];
NSString *paRate2 = [[NSString alloc] initWithFormat:@"$%0.2f",dPaRate2];
if ([paRate2 isEqualToString:@"$0.00"]) {
    lblPaRate.text = paRate;
} else {
    paRate = [[paRate stringByAppendingString:@" - "] stringByAppendingString:paRate2];
    lblPaRate.text = paRate;
}
lblLocal1.text = _Campground.localPhone1;
lblLocal2.text = _Campground.localPhone2;
lblTollFree.text = _Campground.tollFree;
lblFax.text = _Campground.fax;
lblEmail.text = _Campground.email;
lblWebsite.text = _Campground.website;
NSString *gps = _Campground.latitude;
NSString *longitude = _Campground.longitude;
gps = [[gps stringByAppendingString:@", "] stringByAppendingString:longitude];
lblGps.text = gps;
lblHighlights.text = _Campground.highlights;
lblHighlights.lineBreakMode = UILineBreakModeWordWrap;
lblHighlights.numberOfLines = 0;

//label resizing

CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [_Campground.highlights sizeWithFont:lblHighlights.font 
                                  constrainedToSize:maximumLabelSize 
                                                  lineBreakMode:lblHighlights.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = lblHighlights.frame;
newFrame.size.height = expectedLabelSize.height;
lblHighlights.frame = newFrame;

lblTents.text = _Campground.tents;
lblNotes.text = _Campground.notes;
lblDirections.text = _Campground.directions;
lblRentals.text = _Campground.rentals;

}

【问题讨论】:

  • 感谢您的意见,但这并不是我真正想要的。他们正在使用代码创建滚动视图并调整其大小。我正在寻找在我已经拥有的滚动视图中调整我已经拥有的视图的大小。一切正常,它一直向下滚动。我只需要扩展标签所在的视图。
  • 我建议你先创建所有标签,现在你可以动态计算视图高度 - label_height + offset_height_between_label + header_footer_offset。现在有了这个 mch 高度,你可以创建你的视图,然后你可以在那里添加标签。

标签: iphone objective-c ios uiview


【解决方案1】:

- (void) populateLabels 方法位于何处?如果它在视图控制器中,您应该可以轻松访问需要调整大小的视图。或者,如果标签(看起来已经创建)已添加到需要调整大小的视图中,那么您可以访问它们的超级视图。您已经有了所需的尺寸,只需在方法结束时设置超级视图的帧尺寸即可。

如果您尝试首先根据字符串内容查找每个标签的大小,则需要使用 NSString 方法:-sizeWithFont。有几种变体允许您指定约束:

计算单行文本的度量 – 尺寸与字体: – sizeWithFont:forWidth:lineBreakMode: – sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 计算多行文本的度量 – sizeWithFont:constrainedToSize: – sizeWithFont:constrainedToSize:lineBreakMode:

请记住,UILables 只显示 1 行文本。还要记住,这将返回字符串将占用的大小。像 UILabels 和 UITextViews 这样的视图往往会添加填充,因此在计算高度时可能需要考虑这一点。在计算了高度并放置了每个标签之后,您应该知道 superView 需要的大小并进行适当的设置。此外,如果您不知道哪个标签将在视图中最后/最低/最远(superView 的大小应该是 origin.y + 最后一个视图的 size.height),您可以执行以下操作:

CGFloat totalHeight = 0.0f;
for (UIView *view in superView.subviews)
    if (totalHeight < view.frame.origin.y + view.frame.size.height) totalHeight = view.frame.origin.y + view.frame.size.height;

如果您还不知道,这将为您提供超级视图的高度(如果需要,您可以对宽度做同样的事情)。

【讨论】:

  • populateLabels 方法位于我的 CampgroundDetailsViewController.m 文件中。在该文件的 nib 中,我将所有对象(标签、文本视图、按钮等)都放在视图中。然后该视图位于滚动视图内。是不是我做错了什么?
  • 我看不到,在该方法结束时,只需调整包含标签/文本/视图/按钮/等的视图的大小,我还将滚动视图的 contentSize 设置为容纳。您应该可以通过 CampgroundDetailsViewController 的类实例变量访问这两个视图。
  • 你知道如何根据内容动态设置视图吗?听说需要使用sizeToFit,但是应该传入什么?
  • 您是指标签的大小?您可以使用 sizeWithFont: 每个 NSString 实例上可用的方法来找到字符串将采用的矩形的大小。此方法有多种变体,可让您限制大小。我会更新我的回复。
【解决方案2】:

根据子视图调整 UIView 大小的一般方法是sizeToFit 此方法会自动调整 UIView 的大小。

如果你想限制大小,你需要使用sizeThatFits: 这个方法不会自动调整你的 UIView 的大小,而是返回大小。

附注:这两种方法只考虑子视图,而不考虑绘图或核心文本。

【讨论】:

  • 我尝试在我的 scrollView 上使用 sizeToFit 但它没有做任何事情。我的滚动视图中有一个视图,一切都在视图上。我应该换一种方式吗?
【解决方案3】:

你真的需要使用一堆标签吗?
看来您需要使用 UITextView 或 UIScrollView。

【讨论】:

  • 我考虑过使用 UITextView,但问题在于我的目标人群。我正在构建的应用程序是为 RVers 设计的。我们目前有一个 iPhone 应用程序,我们得到的抱怨多于赞扬。它对“方向”、“亮点”和“注释”部分使用 UITextView。他们抱怨一旦到达 TextView 就无法让视图滚动。我们 99% 的投诉是因为我们的会员不知道如何使用他们的设备。
  • 如果 UITextView 中的内容少于 UITextView 本身,它将无法滚动。我看不出这里不使用 UITextView 的理由。但这取决于你。
  • 我已经到了要告诉老人们处理它并使用 UITextView 的地步。我刚刚用 TextView 替换了“Highlights”标签,效果非常好。然后我就不必调整视图的大小了。我可以把它变成静态的,加载一堆 TextView,不用担心它。
  • 一堆 UITextViews???有趣的。您需要一个 UITextView 来处理所有文本内容。
  • 可能是我不明白你的问题。如果您需要强制您的视图重新布局子视图,请调用 [self layoutSubviews]。不幸的是,这个方法的默认实现什么都不做,你需要自己实现它。
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多