欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS: UITableViewCell点击效果下, 防止子控件背景颜色改变

程序员文章站 2024-01-22 09:12:52
uitableviewcell在选中状态下, 上面的子控件会被渲染, 而改变颜色。 如下图所示: 效果 橙色按钮被渲染, 颜色改变 有时, 我们不想要子控件的颜色被渲染, 而是在整个点击过程中颜色...
uitableviewcell在选中状态下, 上面的子控件会被渲染, 而改变颜色。

如下图所示:

iOS: UITableViewCell点击效果下, 防止子控件背景颜色改变
效果
橙色按钮被渲染, 颜色改变

有时, 我们不想要子控件的颜色被渲染, 而是在整个点击过程中颜色都不变

如下图所示:

iOS: UITableViewCell点击效果下, 防止子控件背景颜色改变
目标效果

我们可以在自定义的cell中(继承自uitableviewcell)重写下面两个方法:

- (void)setselected:(bool)selected animated:(bool)animated
- (void)setselected:(bool)selected animated:(bool)animated

具体实现如下

- (void)setselected:(bool)selected animated:(bool)animated
{
    // 获取 contentview 所有子控件
    nsarray<__kindof uiview *> *subviews = self.contentview.subviews;
    // 创建颜色数组
    nsmutablearray *colors = [nsmutablearray array];

    for (uiview *view in subviews) {
        // 获取所有子控件颜色
        [colors addobject:view.backgroundcolor ?: [uicolor clearcolor]];
    }
    // 调用super
    [super setselected:selected animated:animated];
    // 修改控件颜色
    for (int i = 0; i < subviews.count; i++) {
        subviews[i].backgroundcolor = colors[i];
    }
}

- (void)sethighlighted:(bool)highlighted animated:(bool)animated
{
    // 获取 contentview 所有子控件
    nsarray<__kindof uiview *> *subviews = self.contentview.subviews;
    // 创建颜色数组
    nsmutablearray *colors = [nsmutablearray array];

    for (uiview *view in subviews) {
        // 获取所有子控件颜色
        [colors addobject:view.backgroundcolor ?: [uicolor clearcolor]];
    }
    // 调用super
    [super sethighlighted:highlighted animated:animated];
    // 修改控件颜色
    for (int i = 0; i < subviews.count; i++) {
        subviews[i].backgroundcolor = colors[i];
    }
}