IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 调整Button的内部布局和扩展点击区域 -> 正文阅读

[游戏开发]调整Button的内部布局和扩展点击区域

titleEdgeInsets和imageEdgeInsets 调整Button内部布局

要实现上述功能, 我们可以给UIButton来写一个分类:

typedef NS_ENUM(NSUInteger, AxsButtonEdgeInsetsStyle) {
    GYButtonEdgeInsetsStyleTop,    // image在上,label在下
    GYButtonEdgeInsetsStyleLeft,   // image在左,label在右
    GYButtonEdgeInsetsStyleBottom, // image在下,label在上
    GYButtonEdgeInsetsStyleRight,   // image在右,label在左
    GYButtonEdgeInsetsStyleRightBottom,   // image在右下,label在左
    GYButtonEdgeInsetsStyleDefault,
};

@interface UIButton (ImageTitleSpacing)

/**
 *  设置button的titleLabel和imageView的布局样式,及间距
 *
 *  @param style titleLabel和imageView的布局样式
 *  @param space titleLabel和imageView的间距
 */
- (void)layoutButtonWithEdgeInsetsStyle:(GYButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space;


/**

 @param style titleLabel和imageView的布局样式
 @param space titleLabel和imageView的间距
 @param isAdaption 是否适应宽度
 */
- (void)layoutButtonWithEdgeInsetsStyle:(GYButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space
                             isAdaption:(BOOL)isAdaption;


//.m文件的内容
- (void)layoutButtonWithEdgeInsetsStyle:(GYButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space
{
    [self layoutButtonWithEdgeInsetsStyle:style imageTitleSpace:space isAdaption:NO];
}

- (void)layoutButtonWithEdgeInsetsStyle:(GYButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space
                             isAdaption:(BOOL)isAdaption{

    /**
     *  前置知识点:titleEdgeInsets是title相对于其上下左右的inset,跟tableView的contentInset是类似的,
     *  如果只有title,那它上下左右都是相对于button的,image也是一样;
     *  如果同时有image和label,那这时候image的上左下是相对于button,右边是相对于label的;title的上右下是相对于button,左边是相对于image的。
     */
    // 1. 得到imageView和titleLabel的宽、高
    CGFloat imageWith = CGRectGetWidth(self.imageView.frame);
    CGFloat imageHeight = CGRectGetHeight(self.imageView.frame);
    
    CGFloat labelWidth = 0.0;
    CGFloat labelHeight = 0.0;
    if (isAdaption) {//实际宽高(适应)
        labelWidth = self.titleLabel.frame.size.width;
        labelHeight = self.titleLabel.frame.size.height;
    } else {//真实宽高(不适应)
        labelWidth = self.titleLabel.intrinsicContentSize.width;
        labelHeight = self.titleLabel.intrinsicContentSize.height;
    }

    // 2. 声明全局的imageEdgeInsets和labelEdgeInsets
    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
    
    // 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值
    switch (style) {
        case GYButtonEdgeInsetsStyleTop:
        {
            imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
        }
            break;
        case GYButtonEdgeInsetsStyleLeft:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
        }
            break;
        case GYButtonEdgeInsetsStyleBottom:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
        }
            break;
        case GYButtonEdgeInsetsStyleRight:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);
        }
            break;
        case GYButtonEdgeInsetsStyleRightBottom:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, -labelHeight/2.0+imageHeight/2.0, -labelWidth-space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);
            break;
        }
        case GYButtonEdgeInsetsStyleDefault:
        {
            imageEdgeInsets = UIEdgeInsetsZero;
            labelEdgeInsets = UIEdgeInsetsZero;
        }
            break;
        default:
            break;
    }
    // 4. 赋值
    self.titleEdgeInsets = labelEdgeInsets;
    self.imageEdgeInsets = imageEdgeInsets;
}

使用:

//创建一个按钮
AxsEnlargeButton *button = [self newButtonWithImage:nil
                                              highlightedImage:nil
                                                         frame:frame
                                                         title:title
                                                    titleColor:titleColor
                                              titleShadowColor:nil
                                                          font:kFontSize6_new(14)
                                                        target:self
                                         action:@selector(bottomItemClick:)];
    [button setImage:icon forState:UIControlStateNormal];
    //设置按钮整体内容 居中显示
    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    // 根据我们写的分类, 调整图片和文字内容的显示样式, 以及间距
    [button layoutButtonWithEdgeInsetsStyle:style imageTitleSpace:scaleX_6(3)];

扩展UIbutton的点击区域

/// 继承UIButton,增加扩展点击区域的方法
@interface AxsEnlargeButton : UIButton

//扩展点击区域,enlargedEdgeInsets的四个值都设置为enlargedEdge
@property (nonatomic, assign) CGFloat enlargedEdge;

//扩展点击区域
@property (nonatomic, assign) UIEdgeInsets enlargedEdgeInsets;

//设置扩展点击区域
- (void)setEnlargedEdgeWithTop:(CGFloat)top
                          left:(CGFloat)left
                        bottom:(CGFloat)bottom
                         right:(CGFloat)right;

.m文件内容:

- (void)setEnlargedEdge:(CGFloat)enlargedEdge {
    _enlargedEdge = enlargedEdge;
    self.enlargedEdgeInsets = UIEdgeInsetsMake(enlargedEdge, enlargedEdge, enlargedEdge, enlargedEdge);
}

- (void)setEnlargedEdgeWithTop:(CGFloat)top left:(CGFloat)left bottom:(CGFloat)bottom right:(CGFloat)right {
    self.enlargedEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if(self.alpha <= 0.01 || !self.userInteractionEnabled || self.hidden){
        return nil;
    }
    //扩展点击区域
    UIEdgeInsets enlarge = self.enlargedEdgeInsets;
    //如果扩展点击区域为0,则不需要进行扩展
    if (UIEdgeInsetsEqualToEdgeInsets(enlarge, UIEdgeInsetsZero)) {
        return [super hitTest:point withEvent:event];
    }
    //获取扩展后的响应区域
    CGRect enlargedRect = [self enlargeRect:self.bounds insets:enlarge];
    return [self testContainsPoint:enlargedRect point:point] ? self :nil;
}

- (BOOL)testContainsPoint:(CGRect)rect point:(CGPoint)point {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    CGRect rectInWindow = [self convertRect:rect toView:window];
    CGPoint pointInWindow = [self convertPoint:point toView:window];
    
    return CGRectContainsPoint(rectInWindow, pointInWindow);
}

- (CGRect)enlargeRect:(CGRect)rect insets:(UIEdgeInsets)enlarge {
    CGRect enlargeRect = CGRectMake(rect.origin.x - enlarge.left, rect.origin.y - enlarge.top, rect.size.width + enlarge.left + enlarge.right, rect.size.height + enlarge.top + enlarge.bottom);
    return enlargeRect;
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 12:03:55  更:2022-02-26 12:04:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 16:47:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码