iOS UIButtonConfiguration的简单使用

这篇具有很好参考价值的文章主要介绍了iOS UIButtonConfiguration的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、作用

  • UIButtonConfiguration 是 iOS 15.0 新增的设置按钮 UI 元素的对象。
  • 之前有过的设置 navigationBar 背景色和 tabBar 的背景色失效,都是因为新版本需要新增相应的 Configuration 对象才能正确显示。
  • 新增 Configuration 对象设置 navigationBar 的背景色 和 tabBar 的背景色可以看我之前写的博客
  • iOS 13 navigationBar的背景色失效
  • iOS13 tabBar 设置背景色失效
  • 新增 Configuration 对象设置 UI 的这种设计模式就是23种设计模式中的装饰模式。

2、UIButtonConfiguration作用的UI元素

  • UIButtonConfiguration既然是装饰模式的一种实践,那么它必然只会对UI元素做集成,像消息传递、手势、动作、它是不参与的,颜色文本图片背景样式的,它都可以涉及到。

3、具体设置直接看代码

  • oc 版本
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor systemPinkColor];
    
    if (@available(iOS 15.0, *)) {
        //初始化方法有多种,这里直接贴出需要的方法
        //生成扁平纯净的ButtonConfiguration,不设置额外属性
        UIButtonConfiguration *btnConfig = [UIButtonConfiguration plainButtonConfiguration];
        //内置设置了一个圆角为5左右的ButtonConfiguration,但优先级小于btn.layer.cornerRadius
     //   UIButtonConfiguration *btnConfig = [UIButtonConfiguration borderedButtonConfiguration];
        //圆角个性化ButtonConfiguration,主要体现在背景色不透明,文字和图片着色和背景色相反(例如黑色背景,白色文字或者白色背景,黑色文字等)。这一前提在于不主动设置文字颜色和图片颜色的前提。一般情况下,如果不设置文字和图片颜色,它们的颜色则为系统默认的系统蓝色。
     //   UIButtonConfiguration *btnConfig = [UIButtonConfiguration borderedProminentButtonConfiguration];
        
        //设置文字
        //标题
        btnConfig.title = @"text";
        //子标题
        btnConfig.subtitle = @"subText";
        
        //背景颜色(plainButtonConfiguration 模式下没有生效)
        btnConfig.baseBackgroundColor = [UIColor redColor];
        //文字颜色
        btnConfig.baseForegroundColor = [UIColor yellowColor];
        btnConfig.image = [UIImage imageNamed:@"administer_icon_invite"];
        // 图片的位置(默认图片在左边)
        btnConfig.imagePlacement = NSDirectionalRectEdgeLeading;
        //内边距(内容四边距)
       // btnConfig.contentInsets = NSDirectionalEdgeInsetsMake(50, 50, 50, 50);
        //图标距文本的距离
        btnConfig.imagePadding = 10;
        
        //这个是一个关于background相关的config对象,他能处理的内容太多了,背景色,圆角,边框,阴影,自定义绘图(贝塞尔曲线绘图等),毛玻璃特效,背景图片等。只要和背景相关的UI元素,基本都能处理。
        UIBackgroundConfiguration *backgroundConfig = [UIBackgroundConfiguration clearConfiguration];
        //设置背景色(优先级最高)
        backgroundConfig.backgroundColor = [UIColor grayColor];
        //设置圆角半径(如果设置了 btn.layer.cornerRadius,会优先执行这行代码)
        backgroundConfig.cornerRadius = 20;
        btnConfig.background = backgroundConfig;
        
        //标题与子标题的间距,可以为负值
       // btnConfig.titlePadding = 20;
        
        //创建按钮
        UIButton *btn = [UIButton buttonWithConfiguration:btnConfig primaryAction:nil];
        btn.frame = CGRectMake(100, 100, 200, 300);
        btn.backgroundColor = [UIColor greenColor];
        //btnConfig 设置了image,此时这里设置无效
        btn.imageView.image = [UIImage imageNamed:@"1"];
       // btn.layer.cornerRadius = 50;
      //  btn.layer.masksToBounds = YES;
        btn.imageView.backgroundColor = [UIColor blueColor];
        btn.titleLabel.backgroundColor = [UIColor blackColor];
        //设置按钮内容整体水平居右
        btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
        [self.view addSubview:btn];
        
        //根据按钮不同的状态切换不同的buttonConfiguration
        btn.configurationUpdateHandler = ^(UIButton *b) {
            if (b.state == UIControlStateHighlighted) {
                btnConfig.showsActivityIndicator = YES;
                btnConfig.attributedTitle = [[NSAttributedString alloc]initWithString:@"Highlighted Title" attributes:@{NSForegroundColorAttributeName:[UIColor systemRedColor]}];
                    btnConfig.attributedSubtitle = [[NSAttributedString alloc]initWithString:@"Highlighted Subtitle" attributes:@{NSForegroundColorAttributeName:[UIColor systemRedColor]}];
                btnConfig.image = [UIImage systemImageNamed:@"square.and.arrow.up.fill"];
                btnConfig.imageColorTransformer = ^UIColor * _Nonnull(UIColor * _Nonnull color) {
                    return [UIColor systemPurpleColor];
                };
                    ///这个赋值操作必须写,不然不生效
                b.configuration = btnConfig;
            } else {
                btnConfig.showsActivityIndicator = NO;
                btnConfig.attributedTitle = [[NSAttributedString alloc]initWithString:@"Normal Title" attributes:@{NSForegroundColorAttributeName:[UIColor systemRedColor]}];
                btnConfig.attributedSubtitle = [[NSAttributedString alloc]initWithString:@"Normal Subtitle" attributes:@{NSForegroundColorAttributeName:[UIColor systemRedColor]}];
                btnConfig.image = [UIImage systemImageNamed:@"square.and.arrow.up"];
                btnConfig.imageColorTransformer = ^UIColor * _Nonnull(UIColor * _Nonnull color) {
                    return [UIColor systemOrangeColor];
                };
                ///这个赋值操作必须写,不然不生效
                b.configuration = btnConfig;
            }
        };
        
    } else {
        UIButton *likeBtn = [[UIButton alloc]init];
        likeBtn.frame = CGRectMake(50, 50, 100, 50);
        [likeBtn setTitle:@"按钮" forState:UIControlStateNormal];
        likeBtn.titleLabel.font = [UIFont systemFontOfSize:11.0];
        likeBtn.backgroundColor = [UIColor redColor];
        //设置按钮文字居右(无效)
       // likeBtn.titleLabel.textAlignment = NSTextAlignmentRight;
        //设置按钮文字颜色
        [likeBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        //设置按钮整体居右
        likeBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
        likeBtn.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 10);
        likeBtn.imageEdgeInsets = UIEdgeInsetsMake(0, -5, 0, 5);
        [self.view addSubview:likeBtn];
    }
}
  • Swift 版本
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let btn: UIButton = UIButton(frame: CGRect(x: 50, y: 100, width: 200, height: 100))
        btn.backgroundColor = .green
        btn.addTarget(self, action: #selector(btnClicked), for: .touchUpInside)
        if #available(iOS 15.0, *) {
            //初始化 configuration
            btn.configuration = UIButton.Configuration.plain()
            //设置字体颜色
            btn.configuration?.baseForegroundColor = .red
            //设置背景色(plain初始化模式下失效)
            btn.configuration?.baseBackgroundColor = .yellow
            // title 和 subtitle的对其关系,文本是上下排版的
            btn.configuration?.titleAlignment = .trailing
            //标题
            btn.configuration?.title = "title"
            //子标题
            btn.configuration?.subtitle = "subTitle"
            //title 和 subtitle的间距 (可以为负)
            btn.configuration?.titlePadding = 10
            // image 和 文本 的相对位置
            btn.configuration?.imagePlacement = .trailing
            //image 和 文本的间距
            btn.configuration?.imagePadding = 10;
            //button的内容(title,subtitle,image)显示后与按钮的边距,默认有一段距离
            btn.configuration?.contentInsets = NSDirectionalEdgeInsets.zero
            
            // 设置按钮的状态变化的监听,根据变化来改变按钮的显示内容
            btn.configurationUpdateHandler = { (button: UIButton) -> Void in
                switch button.state {
                case .normal:  //默认状态下
                    //设置image
                    button.configuration?.image = UIImage(named: "administer_icon_invite")
                    //背景色
                    button.configuration?.background.backgroundColor = .blue
                    // 设置字体
                    button.configuration?.attributedTitle = AttributedString("resetTitle", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor.black]))
                case .highlighted: //高亮状态下
                    //设置image
                    button.configuration?.image = UIImage(named: "shoucang_sel")
                    //背景色
                    button.configuration?.background.backgroundColor = .gray
                    // 设置字体
                    button.configuration?.attributedTitle = AttributedString("highlightedTitle", attributes: AttributeContainer([NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor.orange]))
                    
                default:
                    print("默认状态: \(button.state)")
                }
                button.updateConfiguration()
            }
        } else {
            //iOS 15 之前的属性设置
            //按钮的背景色
            btn.backgroundColor = .yellow
            btn.setTitle("按钮", for: .normal)
            btn.setTitleColor(UIColor.red, for: .normal)
            btn.setTitleColor(.orange, for: .highlighted)
            btn.setImage(UIImage(named: "shoucang_sel"), for: .normal)
            //设置字体大小
            btn.titleLabel?.font = UIFont.systemFont(ofSize: 18)
            // 改变title与image的位置关系
            btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -5, bottom: 0, right: 5)
            btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: -10)
            
            //设置按钮内容整体水平居右
            btn.contentHorizontalAlignment = .trailing
        }
        
        view.addSubview(btn)
        
    }

    @objc func btnClicked() {
       print("按钮点击了")
    }
}

文章来源地址https://www.toymoban.com/news/detail-621726.html

到了这里,关于iOS UIButtonConfiguration的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用socket.io简单实现多客户端可编辑表格

    之前看了B站小野森森老师的可编辑表格的视频深受启发,今天使用React简单实现一下。 当处于编辑状态的时候,自己和其他人可以看到; 编辑内容后,自己及其他人可以同步看到修改后的内容; 后端服务,使用socket.io起一个后端服务,用于监听连接和发送数据; 前端准备:

    2024年02月06日
    浏览(50)
  • 面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?

    在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型,供大家参考学习。 计算机视角理解IO: 对于计算机而言,任何涉及到计算机核心(CPU和内存)与其

    2024年01月22日
    浏览(42)
  • 史上最简单RabbitMQ中IO流异常的解决 org.springframework.amqp.AmqpIOException: java.io.IOException 超级简单

    org.springframework.amqp.AmqpTimeoutException: java.util.concurrent.TimeoutException     at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:73) ~[spring-rabbit-2.4.8.jar:2.4.8]     at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(Ab

    2024年02月06日
    浏览(48)
  • iOS中一种超简单的路由实现方式

    看了很多的路由实现方式,发现实现的都太复杂,越是复杂的东西越是难以维护,当然复杂的东西好处就是覆盖面比较全。而本文则是使用一种比较简单的方式实现路由的,当然如有建议或者想法可以及时跟我沟通,让我也能有更好的进步。 背景 对于大型项目,由于编译时

    2024年02月12日
    浏览(32)
  • 简单实现Windows与iOS的文件互传

            电脑和iPhone传文件,还在用微信和QQ?         你真正会用iOS系统自带的“文件”吗?         最近汤圆一个人在家实在是没意思,正好想到了这个话题,接下来就和大家聊一聊Windows与iOS的文件互传。         PC端:Windows 10 21H1         移动端:Apple iPhone

    2024年02月04日
    浏览(44)
  • 【iOS】json数据解析以及简单的网络数据请求

    近期写完了暑假最后一个任务——天气预报,在里面用到了简单的网络数据请求以及json数据的解析,特此记录博客总结 JSON是一种轻量级的数据格式,一般用于数据交互。目前JSON的使用非常广泛,绝大多数网络请求都采用了JSON格式。 举个例子: 这就是我们利用API请求到的

    2024年02月14日
    浏览(50)
  • 最简单的方法教你查看 iOS 手机上的日志

    环境准备: mac 电脑一台(一体机和笔记本都一样) iPhone 手机一台 数据线一根 首先,先将 iPhone 通过数据线连接上 mac 电脑 在 mac 电脑上打开控制台(可以通过 command+ 空格,搜索应用) 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一

    2024年02月01日
    浏览(43)
  • Unity3D与iOS的交互 简单版开箱即用

    本文适合的情况如下: Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚本的 调用接口,调用也如下 实现原理 由

    2024年02月06日
    浏览(51)
  • iOS+Appium最简单的环境搭建,快速实现真机自动化测试

    整理不易耗时两星期配置成功,查看一两年前的教程文章走了太多弯路到处都是坑和报错 需配置环境:Homebrew、node、cnpm、Carthage、ios-deploy、libimobiledeviceideviceinstaller,Xcode,appiumWebDriverAgent,appium Inspector 1. Homebrew安装 Homebrew简称brew,是Mac上的软件管理工具(卸载和安装),和

    2023年04月27日
    浏览(50)
  • 从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)

    生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。 我们把这种数据的传输,可以看做

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包