Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone viewForFooterInSection文本问题中的UILabel_Iphone_Objective C_Uilabel - Fatal编程技术网

Iphone viewForFooterInSection文本问题中的UILabel

Iphone viewForFooterInSection文本问题中的UILabel,iphone,objective-c,uilabel,Iphone,Objective C,Uilabel,我想在表格的两个不同页脚中显示两组文本 第3节的文本使用了页脚标题: - (NSString *)tableView:(UITableView *)tv titleForFooterInSection:(NSInteger)section { if (section == 3) return @"SOME TEXT FOR SECTION 3"; else return @""; } 而且效果很好,样式也很正确。 我还想添加一些格式更复杂的文本(

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

第3节的文本使用了页脚标题:

- (NSString *)tableView:(UITableView *)tv titleForFooterInSection:(NSInteger)section
{
    if (section == 3)
        return @"SOME TEXT FOR SECTION 3";
    else
        return @"";
}
而且效果很好,样式也很正确。 我还想添加一些格式更复杂的文本(实际上是左对齐的),因此我创建了一个标签并将其添加到
viewforfooterInstitution
,该标签可以工作,但没有填充(不从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;
}

要获得填充,请将标签添加到另一个视图中,然后将其作为页脚视图返回

- (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:为了避免内存泄漏,您可能需要更好地定义
*页脚的范围,或者使用
自动释放

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

编辑:而不是将所有代码放在
viewForFooterInstition
方法中,我使用自定义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)节中返回正确的高度委托方法

它在CGRect footerFrame=[tv RECTFORFOOTERSENTION:1]上获得了一个错误的EXE;-我将其更改为GRect footerFrame=CGRectMake(0,0320180);和我原来的一样example@daidai抱歉,我没有尝试运行该代码,并试图建议避免在宽度上进行硬编码,以支持不同的屏幕方向。我有一个自定义的视图类来创建一个填充标题,请看我的编辑。哇,这是冗长的,不是仅仅为了添加一个标签…谢谢你的回复。我实现了您的代码,但它从不调用setFooterTitle,因此不显示文本…通过将文本放入init中来显示它。@daidai确实似乎只是为了填充太多了!我想在设置了
视图中的文本后,需要调用
[[self tableView]setNeedsDisplay]
。如果你永远不需要用新标题重新加载视图控制器,那么init就可以正常工作。要正确计算UI所有区域的页脚高度是非常困难的。我希望UITableView自动计算正确的页脚高度。在任何情况下,高度必须从我提到的代理返回。