为UITableView调整自定义单元格中的属性

时间:2015-10-05 06:53:44

标签: objective-c iphone uitableview layoutsubviews

我有UITableView个自定义单元格及其对应的.xib。 我的CustomCell.h有3个属性。我希望能够以编程方式指定这些属性的宽度,而无需使用自动布局。这三个属性是标题视图中的背景图像,标题视图和标题。我想将所有三个属性的with设置为与cell.contentView宽度相同。

我已将[cell setNeedsLayout]放在cellForRowAtIndexPath中,但唯一可更新的属性是CustomCellOne中的ImageViewtitleView。标签的内容不会更新。除了不更新标签宽度这一事实外,我对这个“解决方案”的一个问题是,当显示单元格时,我可以看到背景图像宽度更新。背景图像从320宽度开始并扩展到375宽度。我希望在显示单元格之前执行layoutSubviews

我也尝试将[cell setNeedsLayout]置于willDisplayCell内,但它会产生与上述相同的行为。

我还在CustomCellOne.m的[self setNeedsLayout]方法中尝试了awakeFromNib,但也产生了与上述相同的结果。

此自定义单元格需要能够考虑不同iPhone尺寸的尺寸,[ImageManager]会返回特定设备的相应背景图像。

如果我选择单元格,那么layoutSubviews将根据我的要求进行更新。有没有办法以编程方式触发单元格的选择?这不是一个更好的解决方案,因为它是一个黑客,我确信有更好的方法,正确的方式,做我想要的。

我将永远为谁能帮助我解决这个问题。我的代码如下。

// My ListViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.bounds = [self.view frame];
    self.view.backgroundColor = [UIColor colorWithRed:0.882f green:0.902f blue:0.922f alpha:1.00f];

    [self setNeedsStatusBarAppearanceUpdate];

    // Setup the table view
    self.tableView = [[UITableView alloc] initWithFrame:self.bounds style:UITableViewStylePlain];
    self.tableView.backgroundColor = [UIColor clearColor];
    self.tableView.separatorColor = [UIColor clearColor];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];

    // Setup the bar
    self.myCustomBar = [[StyleOneBar alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(self.bounds), 100.0)];

    SquareCashStyleBehaviorDefiner *behaviorDefiner = [[SquareCashStyleBehaviorDefiner alloc] init];
    behaviorDefiner.elasticMaximumHeightAtTop = YES;
    [behaviorDefiner addSnappingPositionProgress:0.0 forProgressRangeStart:0.0 end:0.5];
    [behaviorDefiner addSnappingPositionProgress:1.0 forProgressRangeStart:0.5 end:1.0];
    behaviorDefiner.snappingEnabled = YES;
    self.myCustomBar.behaviorDefiner = behaviorDefiner;
    [self.view addSubview:self.myCustomBar];

    // Configure a separate UITableViewDelegate and UIScrollViewDelegate (optional)
    self.delegateSplitter = [[BLKDelegateSplitter alloc] initWithFirstDelegate:behaviorDefiner secondDelegate:self];
    self.tableView.delegate = (id<UITableViewDelegate>)self.delegateSplitter;

    //[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    self.tableView.contentInset = UIEdgeInsetsMake(self.myCustomBar.maximumBarHeight, 0.0, 0.0, 0.0);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    CustomCellOne *cell = (CustomCellOne *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell)
    {
        [tableView registerNib:[UINib nibWithNibName:@"CustomCellOne" bundle:nil] forCellReuseIdentifier:cellIdentifier];
        cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    }

    NSString *imageName = [NSString stringWithFormat:@"sunbathing%@", [ImageManager getCollectionImagePartialName]];
    [cell.ivCategory setImage:[UIImage imageNamed:imageName]];
    [cell.lblTitle setText:@"Lazy Beach Day"];
    cell.titleView.frame = CGRectMake(0, 0, CGRectGetWidth(cell.contentView.bounds), 29);

    return cell;
}

我的自定义单元格.h文件

// CustomCellOne.h
#import <UIKit/UIKit.h>

@interface EventCellOne : UITableViewCell

@property (strong, nonatomic) IBOutlet UIImageView *ivCategory;
@property (retain, nonatomic) IBOutlet UIView *titleView;
@property (weak, nonatomic) IBOutlet UILabel *lblTitle;


@end

我的自定义单元格.m文件

#import "CustomCellOne.h"
#import "ImageManager.h"

@implementation EventCellOne

- (void)awakeFromNib
{
    // Initialization code
    [super awakeFromNib];

    self.contentView.backgroundColor = [UIColor clear];
    [self setNeedsLayout];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    //self.bounds = self.contentView.bounds;

    [ImageManager getCollectionImageHeight]);
    CGRect imageViewBounds = CGRectMake(0, 0, [ImageManager getImageMaxWidth], [ImageManager getCollectionImageHeight]);
    [self.ivCategory setFrame:imageViewBounds];

    self.titleView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), 29);
self.titleView.backgroundColor = [UIColor redColor];

    self.lblTitle.frame = CGRectMake(3, 4, CGRectGetWidth(self.contentView.bounds)-6, 21);
    [self.lblTitle setBackgroundColor:[UIColor lightGrayColor]];

}

1 个答案:

答案 0 :(得分:0)

找到解决方案。我不得不取消选中&#34;使用自动布局&#34;在IB中为自定义单元格.xib。我的自定义单元格.m文件只有layoutSubviews。不需要采用直接的方法。

感谢@ user3654258的帮助。