项目中遇到这样一个问题,button的建立是根据服务器返回的数据来建立,好比label信息和image信息都是服务器返回,比较难搞,由于图片返回来都是URL,这是确定没有错误的,不可能服务器给你返回一个图片。
涉及到一个问题,白以前没使用过相似方式设计按钮,多数状况下都是使用本地图片来建立,button上是有个set方法,可是这个方法就是我说的直接付本地图片名的。
后经旁牛教诲,第三方管理网络图片的插件有相应功能,我便导入<UIButton+WebCache>,使用sd_setImageWithURL方法便轻易的解决了此问题。
又涉及到了一个新的问题,就是,此图片并非按原图大小而展现,他是平铺到了整个button上,这就形成了不只图片被拉伸的不成样子,并且图片过大至关难看,想都不用想,这种方式是确定不行的。可是虽然问题解决了,是给图片作了一个等比例的缩小,但是这种方法我以为确定是不对的。
为何说不对呢,由于又涉及到了一个问题,没办法掌握移动尺寸,使用setImageEdgeInsets和setTitleEdgeInsets时无法找到一个可掌握的办法来自动适应屏幕。
这么多问题,我以为应该先从导入的那个第三方来捋顺起,不用想,网上确定有跟我同样的问题的,我又不是大神,能遇到别人遇不到的问题,OC立刻就要退出市场了,我还为OC的问题,确定是不对的。去找找看!
找到了相似的问题,可是并非解决了图片缩小的问题,可是经过使用他的方法,连图片被平铺的问题都修复了,仍是按照上面那种加载图片的方法[button sd_setImageWithURL: forState:];可是导师的方法是此button要去继承一个父button,父button来重写两个方法:
- (CGRect)titleRectForContentRect:(CGRect)contentRect;
- (CGRect)imageRectForContentRect:(CGRect)contentRect;
其实旁牛也一直在说我这么写代码太长,应该把设置放到父类里。可是当时我也不会,不知道到时候怎么整init或者其余什么的。看了导师的代码我不但完成了,并且还完成了呵呵呵,其实仍是一脸懵逼啊!
@interface MemberButton : UIButton
@end
@implementation MemberButton
- (instancetype)initWithFrame:(CGRect)frame {
self = [superinitWithFrame:frame];
if (self) {
self.titleLabel.font = [UIFontsystemFontOfSize:15.f];
self.titleLabel.textAlignment = NSTextAlignmentCenter;
[selfsetTitleColor:[UIColorcolorWithWhite:153.f/255.falpha:1.f] forState:UIControlStateNormal];
}
returnself;
}
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
returnCGRectMake(0.f, contentRect.size.height / 5.f * 3.f, contentRect.size.width, contentRect.size.height / 5.f * 2.f);
}
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
CGFloat width = contentRect.size.width;
CGFloat height = contentRect.size.height;
returnCGRectMake(width / 3.5f, height / 10.f, width / 7.f * 3.f, height / 5.f * 3.f - height / 10.f * 2.f);
}
@end
上面那几个浮点值的修改就能相应改出你所须要的文字与图片的相对位置,并且是能自动屏幕适配的,这点才是最棒的,要否则还有根据屏宽去设定两套或多套偏移方案。