iphone - UILabel in viewForFooterInSection 文本问题

标签 iphone objective-c uilabel

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

第 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 1\r\n"
        "\r\n"
        "MORE TEXT HERE\r\n"
        "AND HERE.\r\n"

        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;
}

最佳答案

要获取填充,请在将标签作为页脚 View 返回之前将标签添加到另一个 View 中;

- (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;
}

注意:您可能希望更好地限定 *footer 的范围以避免内存泄漏或使用 autorelease

我不确定它创建的标签的系统默认值是什么,以保存您提供的作为页脚标题的文本。我想您在创建页脚标签时需要进行试验,因为 Google 没有提供任何有用的信息。

编辑: 我没有将所有代码放在 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

这允许我设置我的标题文本并调整内容的标题大小。我将它延迟加载到我的 View Controller 中;

@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

关于iphone - UILabel in viewForFooterInSection 文本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697929/

相关文章:

iPhone - 表格/网格数据

iphone - 在 MkMapView 上隐藏、显示注释

ios - 如何为我的项目公开方法,但不公开 API?

ios - 如何使 UILabel 文本中的两个或多个字符串指向不同的链接

ios - 为什么我不能更改 UILabel 的框架?

iphone - 带有 sectionsNameKeyPath 和结果顺序的 NSFetchResultsController

ios - 当有两个不同的地方发出信号和等待时如何使用条件

ios - UIButton高亮显示的图像未显示

objective-c - 创建一个 Objective-C API

ios - 改变方向时 UILabel 不调整