У меня есть 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]];
}
Исправьте меня, если я ошибаюсь, но layoutSubviews не вызывается, когда AutoLayout отключен. И вы должны сделать любой рисунок в drawrect. И убедитесь, что вы устанавливаете autoTranslateIntoContraints в false. Также посмотрите, как работает цикл рисования. –
@ user3654258 - смешно, что layoutSubviews в CustomCellOne.m вызывает вызов, но ни одна из модификаций фреймов свойств в этом методе не вступает в силу. Я меняю с UIImageView, но ничего не происходит. Ширина остается на том, что установлено в .xib для этого свойства. Я разместил NSLog внутри layoutsubviews и получил вызов для каждой ячейки, которая отображается. – WillJ
@ user3654258 Я добавил рисунок к drawRect. Ширины UIImageView и UILabel модифицируются, но UILabel остается неизменным. Независимо от того, какую ширину я меняю, он сохраняет ширину, указанную в .xib для этого IBOutlet – WillJ