一提到修改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"];
// }
}
}
}
}
}
});
}
如有错误,欢迎指正
网友评论