在不设置tableViewCell的accessoryView情况下,修改系统自带的accessoryType的样式

某天我遇到了一种奇怪的需求,给系统自带的accessoryType的三角指示挪位置。

当然,要完成这样的需求有很多种方法,最简单就是不用accessoryType属性,直接生成一个accessoryView,然后位置图案颜色动作都随便设置了。问题是我们的灵yan魂fa美zu工zhang并没有上线,截图自制我又觉得麻烦,SO,剩下一条路就是直接对系统自带的三角指示动手脚。

活用某度,搜出来的中文答案主要有这个:

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGRect adjustedFrame = self.accessoryView.frame;
    adjustedFrame.origin.x += 10.0f;
    self.accessoryView.frame = adjustedFrame;
}

来源:iOS 如何更改Cell中默认accessoryView的位置

想法很不错,在继承系统tableViewCell的自定义cell里面,调用layoutSubviews方法,重新布局accessoryView的位置。问题关键在于,我这个cell根本没有自定义accessoryView,所以这个方法虽然会被调用,而accessoryView的值一直为nil,并不能真正改变位置成功。

继续求助于某度,我的目光转向了外国的大神们,在stackoverflow网址,找到了如下英文答案:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (self.accessoryType != UITableViewCellAccessoryNone) {
        float estimatedAccesoryX = MAX(self.textLabel.frame.origin.x + self.textLabel.frame.size.width, self.detailTextLabel.frame.origin.x + self.detailTextLabel.frame.size.width);

        for (UIView *subview in self.subviews) {
            if (subview != self.textLabel &&
                subview != self.detailTextLabel &&
                subview != self.backgroundView &&
                subview != self.contentView &&
                subview != self.selectedBackgroundView &&
                subview != self.imageView &&
                subview.frame.origin.x > estimatedAccesoryX) {

                // This subview should be the accessory view, change its frame
                CGRect frame = subview.frame;
                frame.origin.x -= 10;
                subview.frame = frame;
                break;
            }
        }
    } 
}

来源:Can a standard accessory view be in a different position within a UITableViewCell?

这个方法思路是这样子,在继承系统tableViewCell的自定义cell里,在layoutSubviews方法里通过遍历自身的子控件,找出未知控件,这个未知控件就是我们苦苦追求的accessoryView了,进而改变它的frame。Bingo!

事后反思:

1.遗留风险:首先,遍历子控件,逐个排除,这个工作需要细心且容易遗留。其次,有可能在将来会因为Xcode更新系统新控件而出现问题。期待大神讨论并补充更好的方法,感兴趣的可以阅读第二个链接内的Cœur的回复。

2.在正向逻辑(直接获取accessoryView)走不通的情况下,反向逻辑(遍历排除剩余法)有可能有奇效,思维要更加开放活跃。

3.外国的coder同行也有很多相似经历,不可因为害怕阅读英文而错过有用信息。

 

 

转载请说明原址:https://blog.csdn.net/lrbtony/article/details/80771875

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值