0

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

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

我也尝试过放置[cell setNeedsLayout]在里面willDisplayCell,但它会产生与上述相同的行为。

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

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

如果我选择单元格,那么layoutSubviews它将按照我想要的方式更新。有没有办法以编程方式触发单元格的选择?这不是更好的解决方案,因为它是一种 hack,我相信有更好的方法,正确的方法来做我想做的事。

我将永远欠任何可以帮助我解决这个问题的人。我的代码如下。

// 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]];

}
4

1 回答 1

0

找到了解决方案。对于自定义单元格 .xib,我不得不取消选中 IB 中的“使用自动布局”。我的自定义单元 .m 文件只有 layoutSubviews。不需要drawrect方法。

感谢@user3654258 在他的帮助下。

于 2015-10-05T21:33:26.467 回答