2015-10-05 3 views
0

У меня есть UITableView с пользовательской ячейкой и ее соответствующим .xib. My CustomCell.h имеет 3 объекта недвижимости. Я хочу иметь возможность указать ширину этих свойств программно, не используя автоматическую компоновку. Три свойства - это фоновое изображение, представление заголовка и заголовок в представлении заголовка. Я хочу установить значение для всех трех свойств таким же, как ширина cell.contentView.Изменение свойств в пользовательской ячейке для UITableView

Я место [cell setNeedsLayout] в моем cellForRowAtIndexPath но единственное свойство, которое обновляется является ImageView и titleView в CustomCellOne. С этикеткой не обновляется. Проблема, с которой я сталкиваюсь с этим «решением», помимо того факта, что она не обновляет ширину метки, заключается в том, что при отображении ячейки я могу увидеть обновление ширины фона. Фоновое изображение начинается с ширины 320 и расширяется до 375. Я хочу, чтобы layoutSubviews выполнялся до отображения ячейки.

Я также попытался разместить [cell setNeedsLayout] внутри willDisplayCell, но он производит то же поведение, о котором говорилось выше.

Я также пробовал [self setNeedsLayout] в методе awakeFromNib от CustomCellOne.m, но также дает тот же результат, о котором говорилось выше.

Эта настраиваемая ячейка должна учитывать размеры различных размеров 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]]; 

} 
+0

Исправьте меня, если я ошибаюсь, но layoutSubviews не вызывается, когда AutoLayout отключен. И вы должны сделать любой рисунок в drawrect. И убедитесь, что вы устанавливаете autoTranslateIntoContraints в false. Также посмотрите, как работает цикл рисования. –

+0

@ user3654258 - смешно, что layoutSubviews в CustomCellOne.m вызывает вызов, но ни одна из модификаций фреймов свойств в этом методе не вступает в силу. Я меняю с UIImageView, но ничего не происходит. Ширина остается на том, что установлено в .xib для этого свойства. Я разместил NSLog внутри layoutsubviews и получил вызов для каждой ячейки, которая отображается. – WillJ

+0

@ user3654258 Я добавил рисунок к drawRect. Ширины UIImageView и UILabel модифицируются, но UILabel остается неизменным. Независимо от того, какую ширину я меняю, он сохраняет ширину, указанную в .xib для этого IBOutlet – WillJ

ответ

0

Найдено решение. Мне пришлось снять флажок «Использовать автоматический макет» в IB для пользовательской ячейки .xib. У моего пользовательского сотового файла .m только есть layoutSubviews. Нет необходимости в методе drawrect.

Благодарим вас за @ user3654258.

Смежные вопросы