UIButton 设置 imageView frame

来源:互联网 发布:css 实战手册 知乎 编辑:程序博客网 时间:2024/05/22 10:43

我们发现为UIButton的imageView设置frame时,是无法改变大小的,大小就是图片的大小,位置的话可以利用imageEdgeInsets属性修改位置。

原理:修改UIButton imageView的frame会调用superView也就是UIButton的- (void)layoutSubviews,而这个layoutSubviews会调用UIButton的

- (CGRect)imageRectForContentRect:(CGRect)contentRect; 方法,这个方法默认返回图片的size。


修改imageView的frame的方法有几种,我想到的这几种:

1. 重写 - (CGRect)imageRectForContentRect:(CGRect)contentRect;

2. 删除imageView视图,添加新的imageView,控制frame

3. 重写 layoutSubviews

- (void)layoutSubviews

{

    CGRect frame =self.imageView.frame;

    [superlayoutSubviews];

    self.imageView.frame = frame;

}

4. 不继承UIButton,直接修改layoutSubviews的默认实现

void layoutSubviewsWithoutAutoSetImageViewFrame(idself, SEL sel)

{

    UIButton * btn = (UIButton*)self;

    CGRect frame;

    if (btn.imageView)

    {

        frame = btn.imageView.frame;

    }

    [btn performSelector:@selector(oldLayoutSubviews)];

    if (btn.imageView)

    {

        btn.imageView.frame = frame;

    }

}


void replaceUIButtonLayoutSubviewsMethod()

{

    IMP layoutSubviewsImp = class_getMethodImplementation([UIButtonclass], @selector(layoutSubviews));

    class_addMethod([UIButtonclass], @selector(oldLayoutSubviews), layoutSubviewsImp,"v@:");

    class_replaceMethod([UIButtonclass],@selector(layoutSubviews), (IMP)(layoutSubviewsWithoutAutoSetImageViewFrame),"v@:");

}


欢迎大家支出问题,共同讨论,共同进步,谢谢。


0 0