美文网首页
iOS UITableViewCell 改变系统选中按钮(UIT

iOS UITableViewCell 改变系统选中按钮(UIT

作者: MoShengLive | 来源:发表于2021-08-09 17:01 被阅读0次

    一提到修改UITableViewCellEditControl里图片位置相信很多都会去修改,或者网上一搜一大堆,无非都是一样代码

    - (void)setEditing:(BOOL)editing animated:(BOOL)animated{
        [super setEditing:editing animated:animated];
        for (UIControl *control in self.subviews){
            if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
                for (UIView *v in control.subviews){
                    if ([v isKindOfClass: [UIImageView class]]) {
                        UIImageView *img=(UIImageView *)v;
    //                    img.frame = CGRectMake(img.frame.origin.x, CountHeight(20), img.frame.size.width, img.frame.size.height);
                        img.center = CGPointMake(img.center.x, img.frame.size.height+5);
                        if (!self.selected) {
                            img.image=[UIImage imageNamed:@"weixuanzhongimg.png"];
                        }
                    }
                }
            }
        }
    }
     
    -(void)layoutSubviews{
        NSLog(@"%@",self.subviews);
        for (UIControl *control in self.subviews){
            if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
                for (UIView *v in control.subviews){
                    if ([v isKindOfClass: [UIImageView class]]) {
                        UIImageView *img=(UIImageView *)v;
                        img.center = CGPointMake(img.center.x, img.frame.size.height+5);
     
    //                    img.frame = CGRectMake(img.frame.origin.x, CountHeight(20), img.frame.size.width, img.frame.size.height);
                        if (self.selected) {
                            img.image=[UIImage imageNamed:@"xuanzhongimg.png"];
                        }else{
                            img.image=[UIImage imageNamed:@"weixuzhongimg.png"];
                        }
                    }
                }
            }
        }
        [super layoutSubviews];
    }
    

    这个代码在一般情况是可行的,但是要适配更多手机就显得不那么好用了。

    我就碰到几个问题,在这里列举一下给大家看看,有时候我都怀疑iPhone系统有些随意了。可苦我们这些开发者了
    1,UITableViewCellEditControl跟UITableViewCellContentView高度不一定一样,有的是一样高度(11.4系统高度就是一样),有的系统是貌似固定的(13.2.2系统貌似固定高度),应该iOS13系统都是固定高度的
    2,UITableViewCellEditControl里对imageView设置frame没有效果,开始以为是没有效果,后面调试后发现是你赋值后 系统最后有调用-(void)layoutSubviews方法,使得UITableViewCellEditControl又恢复到原来的原来的frame
    3,比如UITableViewCellEditControl里图片要跟cell某个控件,比如头像保持在同一水平上,你肯定是先获取头像的frame.origin.y,再给UITableViewCellEditControl的y值赋值,使之和头像保持对齐,但是在-(void)layoutSubviews方法获取UITableViewCellContentView子控件,比如头像,处理编辑状态获取头像y值是0(不管头像y值是否是零),这是因为在-(void)layoutSubviews方法,UITableViewCellContentView子控件布局是没有生效的,导致的,所以子控件都是0
    既然我们知道原因,我们怎么去解决它呢
    废话不多说,直接贴出代码,大家看看,里面对每一步都有注释,

    - (void)setEditing:(BOOL)editing animated:(BOOL)animated{
        [super setEditing:editing animated:animated];
        for (UIControl *control in self.subviews){
            if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
                
                CGFloat y = self.demoImageView.frame.origin.y;
                if (@available(iOS 13, *)) {
                    control.frame = CGRectMake(control.frame.origin.x, y, control.frame.size.width, control.frame.size.height);
                }else{
                    for (UIView *v in control.subviews){
                        if ([v isKindOfClass: [UIImageView class]]) {
                            UIImageView *img=(UIImageView *)v;
                            
                            img.frame = CGRectMake(img.frame.origin.x, y, img.frame.size.width, img.frame.size.height);
                            //                    NSLog(@"-----");
                            //                    img.center = CGPointMake(img.center.x, img.frame.size.height+5);
                            //                    if (!self.selected) {
                            //                        img.image=[UIImage imageNamed:@"imail_friends_sends_pictures_select_icon_unselected.png"];
                            //                    }
                        }
                    }
                }
            }
        }
    }
    
    -(void)layoutSubviews{
        //这里会有一个问题,就是每次调用layoutSubviews,UITableViewCellEditControl都会恢复到原来位置,所以会出现跳动,目前只有iOS11.4系统会出现这个问题
        [super layoutSubviews];
        //设置这样目的 就是测试编辑状态 此时子视图里布局并没有生效,导致CGFloat y = self.avatarButton.frame.origin.y;为0值
        dispatch_async(dispatch_get_main_queue(), ^{
            
            //    NSLog(@"%@",self.subviews);
            for (UIControl *control in self.subviews){
                if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
                    //            [self addkvo:control];
                    CGFloat y = self.demoImageView.frame.origin.y;
                    if (@available(iOS 13, *)) {
                        //目前检测control 是一个固定高度,不是跟UITableViewCellContentVie相同,所以把这个frame改变
                        control.frame = CGRectMake(control.frame.origin.x, y, control.frame.size.width, control.frame.size.height);
                    }else{
                        //目前检测11.4系统control 跟UITableViewCellContentVie高度相同相同,里面图片是在中间,所以对imageview设置
                        for (UIView *v in control.subviews){
                            if ([v isKindOfClass: [UIImageView class]]) {
                                UIImageView *img=(UIImageView *)v;
                                //                    img.center = CGPointMake(img.center.x, img.frame.size.height+5);
                                
                                img.frame = CGRectMake(img.frame.origin.x, y, img.frame.size.width, img.frame.size.height);
                                //                    if (self.selected) {
                                //                        img.image=[UIImage imageNamed:@"imail_friends_sends_pictures_select_icon_selected.png"];
                                //                    }else{
                                //                        img.image=[UIImage imageNamed:@"imail_friends_sends_pictures_select_icon_unselected.png"];
                                //                    }
                            }
                        }
                    }
                }
            }
        });
        
        
        
    }
    

    如有错误,欢迎指正

    相关文章

      网友评论

          本文标题:iOS UITableViewCell 改变系统选中按钮(UIT

          本文链接:https://www.haomeiwen.com/subject/cywzvltx.html