自定义button上的title和image的位置

2017-08-04  本文已影响17人  MichalWilson

第一种方法

首先获取button上的titleLabel和imageView的宽和高,

imageView的宽高:

CGFloat imageWith = self.imageView.frame.size.width;

CGFloat imageHeight = self.imageView.frame.size.height;

当然也可以通过这种方法获取imageView的大小

CGFloat imageWidth = CGImageGetWidth([UIImage imageNamed:@"driving"].CGImage);

CGFloat imageHeight = CGImageGetHeight([UIImage imageNamed:@"driving"].CGImage);

不过需要注意的是需要辨别获取的图片是一倍图,还是二倍图亦或者三倍图,然后用imageWidth和imageHeigt除以倍数

titleLabel的宽高:

CGFloat labelWidth = 0.0;

CGFloat labelHeight = 0.0;

if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {

// 由于iOS8中titleLabel的size为0,用下面的这种设置

labelWidth = self.titleLabel.intrinsicContentSize.width;

labelHeight = self.titleLabel.intrinsicContentSize.height;

} else {

labelWidth = self.titleLabel.frame.size.width;

labelHeight = self.titleLabel.frame.size.height;

}

然后设置button的imageEdgeInsets和labelEdgeInsets属性

1.image在上,label在下

imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);

labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);

2.image在左,label在右

imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);

labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);

3.image在下,label在上

imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);

labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);

4.image在右,label在左

imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);

labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);

第二种

通过自定义button,重写button的以下两个方法

-(CGRect)titleRectForContentRect:(CGRect)contentRect;

-(CGRect)imageRectForContentRect:(CGRect)contentRect;

这里面你可以随意设置titleLabel和imageView的位置

第三种

创建Button的时候使用UIButton *selectedButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 100, 100, 30)];来创建,然后把你需要添加的titleLabel或者imageView作为子视图添加到button上,但是苹果官方更推荐使用buttonWithType,因为这个是唯一一个设置buttonType的地方,并且这个方法正在MRC中可以自动释放button,而initWithFrame需要手动释放.

上一篇下一篇

猜你喜欢

热点阅读