UIButton image位置的调节

这篇博客主要介绍了如何在iOS中使用Objective-C和Swift调整UIButton的图像位置。内容涵盖通过imageEdgeInsets和titleEdgeInsets属性来实现图像居左、居右、居上和居下,并提到在Swift中如果没有设置frame,需要通过Snapkit或Masonry来设定大小或布局后设置图像位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UIButton image位置的调节

调节image的位置主要是通过 UIButton的imageEdgeInsets和titleEdgeInsets这两个属性来实现的

    CGFloat imageWidth = self.imageView.bounds.size.width;
    CGFloat imageHeight = self.imageView.bounds.size.height;
    CGFloat titleWidth = self.titleLabel.bounds.size.width;
    CGFloat titleHeight = self.titleLabel.bounds.size.height;
    CGFloat insetAmount = space / 2;
    CGFloat width = self.frame.size.width;
  1. 图片居左,调整 image 和 文字之间的间距 (space 是两者之间的间距)
   self.imageEdgeInsets = UIEdgeInsetsMake(0,-insetAmount, 0, insetAmount);
   self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
  1. 图片居右,调整 image 和 文字之间的间距
  self.imageEdgeInsets = UIEdgeInsetsMake(0,(titleWidth + insetAmount), 0, -(titleWidth + insetAmount));
  self.titleEdgeInsets = UIEdgeInsetsMake(0,-(imageWidth + insetAmount), 0, (imageWidth + insetAmount));
  1. 图片居上,调整 image 和 文字之间的间距
   self.imageEdgeInsets = UIEdgeInsetsMake(-titleHeight - insetAmount,(width - imageWidth)/2, 0, (width - imageWidth)/2 - titleWidth);
   self.titleEdgeInsets = UIEdgeInsetsMake(0, -imageWidth, -imageWidth - insetAmount, 0);
  1. 图片居下,调整 image 和 文字之间的间距
   self.imageEdgeInsets = UIEdgeInsetsMake(0, (width - imageWidth)/2 , -titleHeight - insetAmount, (width - imageWidth)/2 - titleWidth);
   self.titleEdgeInsets = UIEdgeInsetsMake(-imageHeight - insetAmount, -imageWidth, 0, 0);

OC 的实现

typedef NS_ENUM(NSUInteger,ImageLocation) {
             ImageLocationLeft = 0,
             ImageLocationRight,
             ImageLocationTop,
             ImageLocationBottom};

- (void)setImage:(ImageLocation)location space:(CGFloat)space{
    CGFloat imageWidth = self.imageView.bounds.size.width;
    CGFloat imageHeight = self.imageView.bounds.size.height;
    CGFloat titleWidth = self.titleLabel.bounds.size.width;
    CGFloat titleHeight = self.titleLabel.bounds.size.height;
    CGFloat insetAmount = space / 2;
    CGFloat width = self.frame.size.width;
    if (location == ImageLocationLeft) {
        self.imageEdgeInsets = UIEdgeInsetsMake(0,-insetAmount, 0, insetAmount);
        self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
    }else if (location == ImageLocationRight){
        self.imageEdgeInsets = UIEdgeInsetsMake(0,(titleWidth + insetAmount), 0, -(titleWidth + insetAmount));
        self.titleEdgeInsets = UIEdgeInsetsMake(0,-(imageWidth + insetAmount), 0, (imageWidth + insetAmount));
    }else if (location == ImageLocationTop){
        self.imageEdgeInsets = UIEdgeInsetsMake(-titleHeight - insetAmount,(width - imageWidth)/2, 0, (width - imageWidth)/2 - titleWidth);
        self.titleEdgeInsets = UIEdgeInsetsMake(0, -imageWidth, -imageWidth - insetAmount, 0);
    }else if (location == ImageLocationBottom){
        self.imageEdgeInsets = UIEdgeInsetsMake(0, (width - imageWidth)/2 , -titleHeight - insetAmount, (width - imageWidth)/2 - titleWidth);
        self.titleEdgeInsets = UIEdgeInsetsMake(-imageHeight - insetAmount, -imageWidth, 0, 0);
    }
}

Swift实现

public  enum  ImageLocation{
  case  left,right,top,bottom
}

/// 设置image位置(必须要先设置frame)
    /// - Parameters:
    ///   - location: 位置
    ///   - space: 标题与图片的间距
func setImage(location:ImageLocation,space:CGFloat){
        guard let label = titleLabel,let imageV = imageView else {
            return
        }
        let imageWidth = imageV.bounds.size.width
        let imageHeight = imageV.bounds.size.height
        let titleWidth = label.bounds.size.width
        let titleHeight = label.bounds.size.height
        let width = frame.size.width
        switch location {
        case .left:
            titleEdgeInsets = UIEdgeInsets.init(top: 0, left: space/2, bottom: 0, right: -space/2)
            imageEdgeInsets = UIEdgeInsets.init(top: 0, left: -space/2, bottom: 0, right: space/2)
        case .right:
            imageEdgeInsets = UIEdgeInsets.init(top: 0, left: (titleWidth + space/2), bottom: 0, right: -(titleWidth + space/2))
            titleEdgeInsets = UIEdgeInsets.init(top: 0, left:  -(imageWidth + space/2), bottom: 0, right: (imageWidth + space/2))
        case .top:
            imageEdgeInsets = UIEdgeInsets.init(top:-titleHeight - space/2, left:(width - imageWidth)/2, bottom: 0, right: (width - imageWidth)/2 - titleWidth)
            titleEdgeInsets = UIEdgeInsets.init(top: 0, left: -imageWidth, bottom: -imageHeight - space/2, right:  0)
        case .bottom:
            imageEdgeInsets = UIEdgeInsets.init(top:0, left: (width - imageWidth)/2, bottom: -titleHeight - space/2, right: (width - imageWidth)/2 - titleWidth)
            titleEdgeInsets = UIEdgeInsets.init(top: -imageHeight - space/2, left: -imageWidth, bottom: 0, right: 0)
        }
}

如果没有提前设置frame的是无法获取到title的宽度和高度的,如果通过Snapkit或者Masonry 布局的话,可以提前设置size,或者在布局结束后再设置image的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值