选择时从 UITableViewCell 中消失的视图

Posted

技术标签:

【中文标题】选择时从 UITableViewCell 中消失的视图【英文标题】:Views disappearing from UITableViewCell when selected 【发布时间】:2014-01-10 08:30:59 【问题描述】:

我有一个带有自定义 UITableViewCells 的 UITableView。单元格的内容保存在扩展 UIView 的单独类中(我有 3 种内容,我通过隐藏和显示视图进行切换,我采用这种方法是因为我想在单元格之间进行转换)。 所以让我们假设我有一个可见的视图并添加到单元格的 contentView 中。这个视图包含一些文本和一些由 UIViews 组成的矩形。到目前为止一切都很好,但奇怪的是当我触摸单元格时,矩形消失了,文本保持不变。你知道可能是什么问题吗?我也尝试将视图添加到 backgroundView,它也是如此。

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

if (self) 
    self.active = NO;
    state = -1;

    // Touch is not working if the view has no bounds
    self.backgroundView = [[UIView alloc] init];
    self.backgroundColor = [UIColor clearColor];
    self.selectedBackgroundView = [[UIView alloc] init];
    self.selectedBackgroundView.backgroundColor = [UIColor clearColor];
    self.clipsToBounds = YES;
    self.contentView.clipsToBounds = YES;

    // Add empty view
    emptyView = [[View1 alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) andRadius:CELL_DOT_RADIUS];
    emptyView.userInteractionEnabled = NO;
    [self.backgroundView addSubview:emptyView];

观点:

- (id) initWithFrame:(CGRect)frame andRadius:(int)r 
self = [super initWithFrame:frame]; radius = r;

if (self) 

    int outerlineWeight = 1;

    timelineView = [[UIView alloc] initWithFrame:CGRectMake(frame.size.width/4, frame.size.height/2, 1, 1)];
    [self addSubview:timelineView];


    dotView = [[UIView alloc] initWithFrame:CGRectMake(frame.size.width/4-radius, frame.size.height/2-radius, radius*2, radius*2)];
    dotView.layer.cornerRadius = radius;
    dotView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
    [self addSubview:dotView];

    UIView *n = [[UIView alloc] initWithFrame:CGRectMake(160, 0, 50, 20)];
    n.backgroundColor = [UIColor redColor];
    [self addSubview:n];


    middleText = [[UILabel alloc] initWithFrame:dotView.frame];
    middleText.font = [UIFont systemFontOfSize:12];
    middleText.textColor = [UIColor grayColor];
    middleText.backgroundColor = [UIColor clearColor];
    middleText.textAlignment = NSTextAlignmentCenter;
    [self addSubview:middleText];

这是来源,因此您可以根据需要自己尝试。如您所见,橙色矩形消失了,但文本没有。对于我不需要做的事情应该消失,在最好的情况下我想改变它们的颜色。 http://ge.tt/6wRBObD1/v/0?c

【问题讨论】:

您尚未将其添加到内容视图中。您已将其添加到背景视图中,当您选择单元格时它不会显示。 嗨,如果你想尝试,我添加了来源,我在哪里添加我的视图并不重要,因为一切都是透明的。 透明无关紧要。当您选择单元格时,backgroundView 会隐藏,不会发送到后面,因此您添加到其中的任何内容都会消失。将您的视图添加到内容视图。 这就是我的意思,不是所有的东西都消失了,文字也没有消失。然而,根据Apple关于selectedBackgroundView的说法,backgroundView永远不会消失:“UITableViewCell仅在选择单元格时将此属性的值添加为子视图。如果不是,它将所选背景视图添加为直接在背景视图(backgroundView)上方的子视图nil,或在所有其他视图后面。调用 setSelected:animated: 会导致选定的背景视图以 alpha 淡入淡出动画。" 你说得对,对不起。不过,我仍然认为您应该将其添加到内容视图中。 【参考方案1】:

您正在将其添加到背景视图。选择后,选定的背景视图将不显示背景视图。在您的自定义单元格中尝试

- (void)setSelected:(BOOL)selected animated:(BOOL)animated

    [super setSelected:selected animated:animated];
    if (selected) 
        [self.backgroundView addSubview:emptyView];
    
    else
        [self.selectedBackgroundView addSubview:emptyView];
    
    // Configure the view for the selected state

或者向 contentview 添加空视图

【讨论】:

谢谢,这是一种工作,当我触摸单元格时,一切都像它应该的那样,但未选中的单元格是完全空白的。如果我开始玩父视图,我会从我开始的地方得到。如果你想玩,我添加了来源。 或者向 contentview 添加空视图可能是更好的方法【参考方案2】:

框架设置的一件事你需要覆盖“layoutsubviews”方法...... 在自定义单元格中

在初始化方法中初始化所有视图,即- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier方法并将其添加到单元格

- (void)layoutSubviews 中只需为单元格中的视图设置框架,

使用标签属性访问layoutsubviews中的视图,如果不是该属性

    - (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

      self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

      if (self) 
          self.active = NO;
          state = -1;

       // Touch is not working if the view has no bounds
       self.backgroundView = [[UIView alloc] init];
       self.backgroundColor = [UIColor clearColor];
       self.selectedBackgroundView = [[UIView alloc] init];
       self.selectedBackgroundView.backgroundColor = [UIColor clearColor];
       self.clipsToBounds = YES;
       self.contentView.clipsToBounds = YES;

       // Add empty view
       //emptyView = [[View1 alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) andRadius:CELL_DOT_RADIUS];//dont set the frame heare do it layoutsubviews

       emptyView = [[View1 alloc] init];
       emptyView.userInteractionEnabled = NO;
       emptyView.tag = 100;
      [self.backgroundView addSubview:emptyView];


  - (void)layoutSubviews
    
         [super layoutSubviews];

         UIView *emptyView = [self viewWithTag:100];//your background view heare u can get the frame values for ur cell
         emptyView.frame = self.bounds;//better do it for other views in cell also 
          //test it by setting some background color 

 

希望这对你有帮助 ...:)

【讨论】:

不要认为这很重要,但你是对的,我应该添加这个,因为最初单元格的高度为 44px,默认单元格高度。即使有 1px,视图的内容也应该是可见的。如果你想玩,我添加了来源。谢谢。【参考方案3】:

好的,就像我在上一条评论中所说的那样,任何子视图的背景颜色都是问题,在选定状态下被清除。对于在界面生成器中创建的单元格,不会出现问题,我的单元格是以编程方式创建的。 我通过在 drawRect 方法中使用 CoreGraphics 进行绘制来解决此问题。

【讨论】:

如果我将 selectionStyle 设置为 UITableViewCellSelectionStyleNone 工作正常,问题就解决了。【参考方案4】:

与 UICollectionView 一样,UITableView 具有在 AutoLayout 之前构建的背景视图。如果你使用 autoLayout,你应该确保 backgroundView 有一个框架。否则就是会消失。 在您的单元子类中,您可以执行以下操作:

    -(void)setBackgroundView:(UIView *)backgroundView

    super.backgroundView = backgroundView;
    self.backgroundView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.backgroundView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];

【讨论】:

【参考方案5】:

您需要在 swift 中全局声明 viewcontroller 对象,这将导致 Strong,以防您在本地声明它会导致单元格不断消失。

var refineViewController : RefineViewController?

然后您可以使用以下不会导致单元格消失的代码访问该控制器。

func showRefineView(isFindHomeTab isFindHomeTab : Bool)


    refineViewController =   RefineViewController(nibName: String(BaseGroupedTableVC),bundle : nil)

    refineViewController!.refineSearchDelegate = self

    refineViewController!.view.frame = CGRectMake(0, -490, self.view.frame.size.width, self.view.frame.size.height)

    UIView.animateWithDuration(0.3, delay: 0.0, options: .CurveEaseOut, animations:
        

            self.refineViewController!.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)
            self.refineViewController!.isFindHomeTab = isFindHomeTab

        , completion: nil)

        self.view.addSubview(refineViewController!.view)


【讨论】:

以上是关于选择时从 UITableViewCell 中消失的视图的主要内容,如果未能解决你的问题,请参考以下文章

选择 UITableViewCell 时 UITabBar 消失

点击单元格时从 uitableviewcell 类调用 uipangesture

不再使用时从 UITableViewCell 中删除观察者

UITableViewCell的accessoryView在可见视图改变后消失

隐藏 UITableViewCell 时,accessoryType 复选标记消失

UITableViewCell 和消失的分隔符