在自定义UITableViewCell上调用deselectRowAtIndexPath不是流畅的过渡

时间:2012-09-05 23:30:33

标签: ios uitableview

这是有问题的应用部分的设置。

MyTableViewController是我的自定义UITableViewController类。

TableViewController1,2和3都是MyTableViewController类型。 1和2是由tabbarcontroller控制的视图控制器,3从1中选择一个单元格后被推入堆栈。

BaseCell是我的UITableViewCell子类。

MyCell1,2和3都是BaseCell类型。

单元格设置如下

BaseCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    // Initialization code
    UIView *myContentView = self.contentView;

    self.gradientView = [[UIView alloc] initWithFrame:myContentView.frame];
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.colors = [UIColor grayGradient];
    [self.gradientView.layer insertSublayer:gradient atIndex:0];
    self.gradientView.backgroundColor = [UIColor blueColor];
    [myContentView addSubview:self.gradientView];
}
return self;
}

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

// Configure the view for the selected state
if (selected) {
    self.gradientView.layer.hidden = TRUE;
} else {
    self.gradientView.layer.hidden = FALSE;
}
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
[super setHighlighted:highlighted animated:animated];

// Configure the view for the highlighted state
if (highlighted) {
    self.gradientView.layer.hidden = TRUE;
} else {
    self.gradientView.layer.hidden = FALSE;
}
}

-(UILabel *)newLabelWithColor:(UIColor *)incomingColor font:(UIFont *)incomingFont
{
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectZero];
newLabel.backgroundColor = [UIColor clearColor];
newLabel.opaque = YES;
newLabel.textColor = incomingColor;
newLabel.highlightedTextColor = [UIColor whiteColor];
newLabel.font = incomingFont;
return newLabel;
}

因此,扩展BaseCell的每个单元都具有渐变背景。 Cell1,2和3继续以类似的方式向contentView添加更多对象。每个单元格都是为不同目的而定制的,所有单元格都遵循相同的格式。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    // Initialization code
    UIView *myContentView = self.contentView;

    self.someLabel = [self newLabelWithColor:[UIColor blueColor] font:[UIFont boldSystemFontOfSize:12]];
    [myContentView addSubview:self.someLabel];

    self.someView = [UIView] alloc] init];
    [myContentView addSubview:self.someView];
}
return self;
}

- (void)layoutSubviews
{
   //Layout any views necessary
}

- (void)setupCell
{
     self.someLabel = @"Placeholder Text";
     self.someView.backGroundColor = [UIColor redColor];
}

想象一下,标签只是单元格中的标题,视图是单元格左侧的一个小条形,表示状态(实际代码具有确定不同颜色/状态的逻辑)。

最后一点信息是MyTableViewController似乎不希望自己进行单元格取消选择。我没有任何地方的clearSelectionOnViewWillAppear = NO(并且默认状态为YES),但当我返回TableViewController1之一时,单元格仍保持选中状态。奇怪的是,3不会分享这种行为,我无法弄清楚原因。因此我实施了

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}

并取消选择。如果我把它放在viewWillAppear中,它就不起作用了。所以我的第一个问题是,有谁知道为什么会发生这种行为? UITableViewController的标准行为是保持单元格突出显示,然后在返回时取消选择它,以便提醒用户他们选择了什么,如联系人中所示。我想知道这个问题是否导致了我的下一个问题,这是帖子的主题。

取消选择时,细胞看起来很糟糕。流程就像这样返回TableView - >在选定状态下,单元格以蓝色突出显示 - >单元格返回突出显示的状态(所有文本都是白色的渐变背景,self.someView仍然不可见) - >单元格返回正常状态(文本为正常颜色,self.someView重新出现)。转换根本不是流动的,您可以清楚地看到单元格在这些状态中移动,其中单元格中的单元格平滑过渡,蓝色渐变和正常的文本颜色出现。

这里有大量的信息,我实际上已经通过撰写这篇文章了解了很多事情,但是如果它是取消选择的问题或者如果它是一个问题,我仍然感到困惑我设置单元格的方式,或者在我的setSelected和setHighlighted的覆盖中它可能是一个问题。感谢您的帮助,我非常感谢您考虑此处的内容量。

0 个答案:

没有答案