iOS-图文并排

图片文字的并排布局在项目中非常的常见,iOS系统中没有很好的控件来具体的实现,虽然系统的UIButton的功能可以实现部分此类的功能,但是使用UIButton时自动布局不是太友好,需要固定button 的大小但是实际的开发中button的大小是不固定的,大小是根据图片和文字改变的,而且图片和文字的距离难以设置,通过多个控件(UIImageView ,UILabel)组合也可以实现,如果需要添加点击事件还需要在包装一层view,这种情况会造成代码的冗余,而且相应的文件代码量同样也会增多,基于以上可以封装通用的图片文字混排组件

通过自定义的图文并排,遇到此类的布局不需要过多的控件组合实现,以实现在App的通用,减少代码的量及相应功能的开发时间,使实现的效果更好,提高用户的使用体验。

效果图


截屏2023-05-17 09.27.28.png

具体实现

  1. 自定义View在此View中声明UIImageView,UILabel实现类似于系统按钮的点击方法和图文并排
  2. 通过枚举实现图文位置,布局的方式,点击的方式
  3. 声明类似于UIButton的点击方法,给自定义的View添加点击事件
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSUInteger, TextImagePosition) {
    
    TextImagePositionTop = 0,//图片在上面
    TextImagePositionBottom = 1,//图片在下面
    TextImagePositionLeft = 2,//图片在左面
    TextImagePositionRight = 3,//图片在右面
};

typedef NS_ENUM(NSUInteger, TextImageLayout) {

    TextImageLayoutEdgeZero = 0, // 图片或者文字到边距是零
    TextImageLayoutCenter, //图片文字剧中的
};

typedef NS_ENUM(NSUInteger, TouchesEvents) {

    TouchesEventsBegan = 0, //触摸开始
    TouchesEventsEnd, // 触摸结束
};

@interface OCTextImageView : UIView

@property (nonatomic, strong) UIView      *bgView;

@property (nonatomic, strong) UIImageView *imageView;//图片
@property (nonatomic, strong) UILabel     *titleLabel;//标题

@property (nonatomic, assign) BOOL        selected;//按钮的选择属性

//控制字体与控件边界的间隙,只有TextImageLayoutEdgeZero设置有效
@property (nonatomic, assign) UIEdgeInsets contentEdgeInsets;

- (instancetype)initSpace:(double)space
               layoutType:(TextImageLayout)layoutType
             positionType:(TextImagePosition)positionType;

- (instancetype)initText:(NSString *)text
                   image:(NSString *)name
                    font:(UIFont *)font
               textColor:(UIColor *)textColor
                   space:(double)space
              layoutType:(TextImageLayout)layoutType
            positionType:(TextImagePosition)positionType;


//TargetAction回调
-(void)addTarget:(id)target
          action:(SEL)action forTouchesEvents:(TouchesEvents)eventTouch;

@end
#import "OCTextImageView.h"

@interface OCTextImageView ()

@property (nonatomic,weak)    id     target;
@property (nonatomic, assign) SEL    action;
@property (nonatomic, assign) CGRect rect;
@property (nonatomic, assign) TouchesEvents     eventTouch;

@property (nonatomic, assign) TextImagePosition positionType;
@property (nonatomic, assign) TextImageLayout   layoutType;
@property (nonatomic, assign) double  space;

@end

@implementation OCTextImageView

- (instancetype)initSpace:(double)space
               layoutType:(TextImageLayout)layoutType
             positionType:(TextImagePosition)positionType {
    
    if (self = [super init])
    {
        self.space = space;
        self.positionType = positionType;
        self.layoutType = layoutType;
        [self makeSpace:space layoutType:layoutType positionType:positionType];
    }
    return  self;
}

- (instancetype)initText:(NSString *)text
                    image:(NSString *)name
                     font:(UIFont *)font
                textColor:(UIColor *)textColor
                    space:(double)space
               layoutType:(TextImageLayout)layoutType
             positionType:(TextImagePosition)positionType {
    
    if(self = [super init])
    {
        self.titleLabel.text = text;
        if(name.length > 0)
        {
            self.imageView.image = IMAGE(name);
        }
        self.titleLabel.textColor = textColor;
        self.titleLabel.font = font;
        self.space = space;
        self.positionType = positionType;
        self.layoutType = layoutType;
        [self makeSpace:space layoutType:layoutType positionType:positionType];
    }
    return self;
}

/* 布局 */
- (void)makeSpace:(double)space
       layoutType:(TextImageLayout)layoutType
     positionType:(TextImagePosition)positionType {
    
    [self addSubview:self.bgView];
    [self.bgView addSubview:self.titleLabel];
    [self.bgView addSubview:self.imageView];
    
    if(layoutType == TextImageLayoutCenter)
    {
        [self.bgView mas_remakeConstraints:^(MASConstraintMaker *make) {
           
            make.center.equalTo(self);
        }];
        [self textImageLayout];
    }
    if(layoutType  == TextImageLayoutEdgeZero)
    {
        [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {

            make.left.top.right.bottom.equalTo(self).offset(0);
        }];
        [self textImageLayout];
    }
}

- (void)textImageLayout {
    
    //左
    if(self.positionType == TextImagePositionLeft)
    {
        [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.left.top.bottom.equalTo(self.bgView).offset(0);
        }];
        [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.top.bottom.equalTo(self.bgView).offset(0);
            make.left.equalTo(self.imageView.mas_right).offset(self.space);
        }];
    }
    
    //右
    if(self.positionType == TextImagePositionRight)
    {
        [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.left.top.bottom.equalTo(self.bgView).offset(0);
        }];
        [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.top.bottom.equalTo(self.bgView).offset(0);
            make.left.equalTo(self.titleLabel.mas_right).offset(self.space);
        }];
    }
    
    //上
    if(self.positionType == TextImagePositionTop)
    {
        [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.right.equalTo(self.bgView).offset(0);
            make.centerX.equalTo(self.bgView);
        }];
        [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.top.equalTo(self.imageView.mas_bottom).offset(self.space);
            make.centerX.equalTo(self.bgView);
            make.left.bottom.right.equalTo(self.bgView).offset(0);
        }];
    }
    
    //下
    if(self.positionType == TextImagePositionBottom)
    {
        [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.right.equalTo(self.bgView).offset(0);
            make.centerX.equalTo(self.bgView);
        }];
        [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.bottom.right.equalTo(self.bgView).offset(0);
            make.centerX.equalTo(self.bgView);
            make.top.equalTo(self.titleLabel.mas_bottom).offset(self.space);
        }];
    }
}

/* TargetAction回调 */
-(void)addTarget:(id)target action:(SEL)action forTouchesEvents:(TouchesEvents)eventTouch  {

     self.target = target;
     self.action = action;
     self.eventTouch = eventTouch;
}

/* 开始触摸 */
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    if(self.eventTouch == TouchesEventsBegan)
    {
        [self touches:touches withEvent:event];
    }
}

/* 结束触摸 */
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    if(self.eventTouch == TouchesEventsEnd)
    {
        [self touches:touches withEvent:event];
    }
}

- (void)touches:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    //获取触摸对象
    UITouch *touche = [touches anyObject];

    //获取touche的位置
    CGPoint point = [touche locationInView:self];

    //判断点是否在button中
    if (CGRectContainsPoint(self.bounds, point))
    {
        //执行action
        if(!self.target)
        {
            return;
        }
        else
        {
            NSString *methodName = NSStringFromSelector(self.action);//获取方法名字
            if([methodName hasSuffix:@":"])
            {//有参数
                IMP imp = [self.target methodForSelector:self.action];
                CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
                self.rect = self.target?
                func(self.target, self.action, self.rect, self) : CGRectZero;
            }
            else
            {//没有
                IMP imp = [self.target methodForSelector:self.action];
                void (*func)(id, SEL) = (void *)imp;
                func(self.target, self.action);
            }
        }
    }
}

- (void)setContentEdgeInsets:(UIEdgeInsets)contentEdgeInsets {
    
    if(self.layoutType == TextImageLayoutEdgeZero)
    {
        _contentEdgeInsets = contentEdgeInsets;
        [self.bgView mas_remakeConstraints:^(MASConstraintMaker *make) {

            make.edges.mas_equalTo(contentEdgeInsets);
        }];
    }
}


#pragma mark -- lazy

- (UIView *)bgView {
    
    if(_bgView == nil)
    {
        _bgView = [[UIView alloc] init];
    }
    return _bgView;
}
- (UIImageView *)imageView {
    
    if (_imageView == nil)
    {
        _imageView = [[UIImageView alloc] init];
        _imageView.contentMode = UIViewContentModeScaleAspectFit;
    }
    return _imageView;
}

- (UILabel *)titleLabel {
    
    if (_titleLabel == nil)
    {
        _titleLabel = [[UILabel alloc] init];
        _titleLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _titleLabel;
}

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容