viewForFooterInSection文本中的UILabel问题



我想在我的表格的两个不同的页脚显示两组文本。

section 3的文本使用titleForFooterInSection:

- (NSString *)tableView:(UITableView *)tv titleForFooterInSection:(NSInteger)section
{
    if (section == 3)
        return @"SOME TEXT FOR SECTION 3";
    else
        return @"";
}

和工作很好,样式正确。我还想添加一些更复杂的格式文本(只是左对齐真的),所以我创建了一个标签,并将其添加到viewForFooterInSection,它的工作,但没有填充(不开始于x = 20 &Y = 20,从主窗口边缘开始),并且不像其他文本那样样式。

- (UIView *)tableView:(UITableView *)tv viewForFooterInSection:(NSInteger)section
{
    if (section == 1) 
    {
        UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(20, 20, 100, 50)] autorelease];
        label.text = @"SOME COMPLICATED TEXT FOR SECTION 1rn"
        "rn"
        "MORE TEXT HERErn"
        "AND HERE.rn"
        label.backgroundColor = [UIColor clearColor];
        label.font = [UIFont systemFontOfSize:14];
        label.shadowColor = [UIColor colorWithWhite:0.8 alpha:0.8];
        label.textColor = [UIColor blueColor];
        label.lineBreakMode = UILineBreakModeWordWrap;
        label.textAlignment = UITextAlignmentLeft;
        label.numberOfLines = 0;
       [label sizeToFit];
    return label;       
    }
    else
        return nil;
}
-(CGFloat)tableView:(UITableView *)tv heightForFooterInSection:(NSInteger)section
{
    if (section == 1) 
        return 180.0f;
    else if (section == 3)
        return 50.0f;
    else 
        return 0.0f;
}

要获得padding,在返回作为footer视图之前将标签添加到另一个视图;

- (UIView *)tableView:(UITableView *)tv viewForFooterInSection:(NSInteger)section
{
  ...
  CGRect footerFrame = [tv rectForFooterInSection:1];
  CGRect labelFrame = CGRectMake(20, 20, footerFrame.size.width - 40, footerFrame.size.height - 40);
  UIView *footer = [[UIView alloc] initWithFrame:footerFrame];
  UILabel *footerLabel = [[UILabel alloc] initWithFrame:labelFrame];
  [footer addSubview:footerLabel];
  [footerLabel release];
  ...
  return footer;
}

NB:您可能希望更好地作用域*footer以避免内存泄漏或使用autorelease

我不确定它创建的标签的系统默认值是什么,以保存您提供的文本作为页脚的标题。我猜你需要在创建页脚标签时进行实验,因为谷歌没有抛出任何有用的东西。

编辑:而不是把所有的代码在viewForFooterInSection方法我使用自定义UIView;

@interface CustomHeaderView : UIView {
    NSString *headerTitle;
}
@property (nonatomic, retain) NSString *headerTitle;
@end
@implementation CustomHeaderView
@synthesize headerTitle;
- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // create frame with padding    
        CGRect labelFrame = CGRectMake(8, 8, frame.size.width - 16, frame.size.height - 16);
        UILabel *headerText = [[UILabel alloc] initWithFrame:labelFrame];
        [headerText setNumberOfLines:0];
        [headerText setFont:[UIFont boldSystemFontOfSize:14.0]];            
        [self addSubview:headerText];
        [headerText release];           
    }
    return self;
}
- (void)setHeaderTitle:(NSString *)title {
    [title retain];
    [headerTitle release];
    UILabel *label = [[self subviews] objectAtIndex:0];
    [label setText:title];
    [label sizeToFit];
    CGRect viewFrame = [self frame];
    CGRect labelFrame = [label frame];
    viewFrame.size.height = labelFrame.size.height + 16;
    [self setFrame:viewFrame];
    [self setNeedsLayout];
    headerTitle = title;
}
- (void)dealloc {
    [headerTitle release];
    [super dealloc];
}
@end

这允许我设置我的标题文本,并有标题的内容调整大小。我在视图控制器中延迟加载这个;

@interface MyViewController
{
    UIView *headerView;
}
- (UIView *) headerView;
@end
@implementation MyViewController
- (UIView *) headerView {
    if(headerView)
        return headerView;
    float w = [[self view] bounds].size.width;
    // height irrelevant as long as non zero custom view will resize
    CGRect headerFrame = CGRectMake(0, 0, w, 32);
    headerView = [[CustomHeaderView alloc] initWithFrame:headerFrame];
    return headerView;
}
- (UIView *) tableView:(UITableView *)tv viewForHeaderInSection:(NSInteger)sec {
    return [self headerView];
}

- (void) viewWillAppear:(BOOL)animated {
    [(CustomHeaderView *)[self headerView] setHeaderTitle:@"My Custom Header"]];
}
@end

确保在- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;委托方法中返回适当的高度。

最新更新