在Landscape中自动调整UITableCells内容的大小 [英] autoresizing UITableCells contents in Landscape
问题描述
在UITableView中,我通过UILabels将内容添加到单元格中.
定义最佳大小(与单元格宽度允许的大小一样),我注意到只有tableView.contentSize.width
是可靠的,因为cell.contentView.bounds
始终提供纵向宽度,即使在横向情况下也是如此>
与autoresizingMask
结合使用时效果很好:当我从肖像"切换为风景",然后再次切换为肖像"时.
直接在景观中加载View时出现问题.即使断点为我显示正确的宽度
,我的UILabels的宽度也大于屏幕.在风景和肖像之间切换不会改变任何东西,宽度仍然大于屏幕.
如果我不使用autoresizingMask,则宽度是正确的,即使使用了短文本,宽度也会从屏幕上消失(但我注意到这一点仅是由于测试背景色或使用非常大的NSString引起的) ).
简而言之:
- 人像>风景>肖像>风景... 很好(调整大小)
- 风景>肖像>风景>肖像... 错误(宽度超出范围)
我的代码简化了:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//[...]
UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0];
CGRect frame = CGRectMake(cell.contentView.bounds.origin.x + 20,
cell.contentView.bounds.origin.y + 4,
tableView.contentSize.width - 50,
font.lineHeight);
//at this point a breakpoint shows that frame is whatever I asked (ex: 200 for test)
//but still the labels is wider than the screen
UILabel *result = [[[UILabel alloc] initWithFrame:frame] autorelease];
[result setText:@"bouh!"];
result.lineBreakMode = UILineBreakModeWordWrap;
result.numberOfLines = 1;
result.font = font;
//if I comment this line, the width is always what I want
result.autoresizingMask = UIViewAutoresizingFlexibleWidth;
//test to see the real size
result.backgroundColor = [UIColor orangeColor];
[cell.contentView addSubview:result];
//[...]
return cell;
}
我在这里向您寻求帮助,以了解是否有更好的方法来做我想要的事情?如果没有,我在做什么错了?
我找不到一种简单易用的通用解决方案(适用于每个屏幕).
但是,这是我所做的以使其工作:
//in portrait cell width works fine with autoResize
//in landscape tableView width works fine with autoResize
CGFloat cellWidth;
if ( [UIDevice currentDevice].orientation != UIDeviceOrientationLandscapeLeft
&& [UIDevice currentDevice].orientation != UIDeviceOrientationLandscapeRight)
{
cellWidth = tableView.contentSize.width;
}
else
{
cellWidth = cell.contentView.bounds.size.width;
}
因此,在以后的代码中,我将以这种方式使用它:
CGRect frame = CGRectMake(cell.contentView.bounds.origin.x + 20,
cell.contentView.bounds.origin.y + 4,
cellWidth - 50,
font.lineHeight);
UILabel *result = [[[UILabel alloc] initWithFrame:frame] autorelease];
但是有些奇怪:我必须始终使用tableView.contentSize.width
作为活动指标的框架,因为cell.contentView.bounds.size.width
即使在风景中也只有320
CGRect activityIndicatorRect =
CGRectMake(
cell.contentView.bounds.origin.x + tableView.contentSize.width - 60 ,
cell.contentView.bounds.origin.y + 17,
30, 30);
In a UITableView, I add content to my cells via UILabels.
To define the optimal size (as large as allowed by the cell's width) I noticed that only tableView.contentSize.width
was reliable, because cell.contentView.bounds
gives always a portrait width, even in landscape
This works very well in couple with autoresizingMask
: when I switch from Portrait to Landscape and again to Portrait.
Problems come when I load my View directly in Landscape. The width of my UILabels is larger than the screen, even if a breakpoint shows me a correct width for tableView.contentSize.width
Switching between landscape and portait changes nothing, the width is still larger than the screen.
If I don't use autoresizingMask, the width is correct, if I use it, even with a short text it goes out of the screen (but I notice it only thanks to a test background color or with using very large NSString).
In brief:
- portrait > landscape > portrait > landscape... is fine (resize perfectly)
- landscape > portrait > landscape > portrait... bugs (width outrange)
My code simplified:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//[...]
UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0];
CGRect frame = CGRectMake(cell.contentView.bounds.origin.x + 20,
cell.contentView.bounds.origin.y + 4,
tableView.contentSize.width - 50,
font.lineHeight);
//at this point a breakpoint shows that frame is whatever I asked (ex: 200 for test)
//but still the labels is wider than the screen
UILabel *result = [[[UILabel alloc] initWithFrame:frame] autorelease];
[result setText:@"bouh!"];
result.lineBreakMode = UILineBreakModeWordWrap;
result.numberOfLines = 1;
result.font = font;
//if I comment this line, the width is always what I want
result.autoresizingMask = UIViewAutoresizingFlexibleWidth;
//test to see the real size
result.backgroundColor = [UIColor orangeColor];
[cell.contentView addSubview:result];
//[...]
return cell;
}
I'm asking your help here in order to see if there's a better way to do what I wanted? if not, what am I doing wrong?
I could not find a clean easy universal solution (adaptable to every screen).
But here is what I did to make it work:
//in portrait cell width works fine with autoResize
//in landscape tableView width works fine with autoResize
CGFloat cellWidth;
if ( [UIDevice currentDevice].orientation != UIDeviceOrientationLandscapeLeft
&& [UIDevice currentDevice].orientation != UIDeviceOrientationLandscapeRight)
{
cellWidth = tableView.contentSize.width;
}
else
{
cellWidth = cell.contentView.bounds.size.width;
}
And so, later in the code I use it that way:
CGRect frame = CGRectMake(cell.contentView.bounds.origin.x + 20,
cell.contentView.bounds.origin.y + 4,
cellWidth - 50,
font.lineHeight);
UILabel *result = [[[UILabel alloc] initWithFrame:frame] autorelease];
But something was weird: I needed to use always tableView.contentSize.width
for the frame of my Activity Indicators because cell.contentView.bounds.size.width
was only 320 even in Landscape
CGRect activityIndicatorRect =
CGRectMake(
cell.contentView.bounds.origin.x + tableView.contentSize.width - 60 ,
cell.contentView.bounds.origin.y + 17,
30, 30);
这篇关于在Landscape中自动调整UITableCells内容的大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!