热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SwiftUIKitUIControl

1.描述1.1.简介Thebaseclassforcontrols,whicharevisualelementsthatconve
1.描述
1.1.简介

The base class for controls, which are visual elements that convey a specific action or intention in response to user interactions.(一个所有控制器的基类,这类控制器是可以传达用于响应用户交互的行为或者意图的可视元素)

class UIControl : UIView
Swift-UIKit-UIControl
image.png

我们app可能帮助导航,手机用户输入或者操作内容的控制器(Controls)实现元素比如按钮和滑块(sliders).控制器使用Target-Action机制来报告用户的行为给我们的App.

我们不能直接创建UIControl的类实例.UIControl类是一个需要我们扩展来实现自定义控制器的子类化的内容.我们能够子类化已经存在的控制器类来扩展或者修改他们的行为.比如,我们可以覆盖其方法来追踪我们的触摸事件或者决定控制器状态何时变化.

一个控制器的状态决定了它的表现和他能支持的用户交互能力.控制器能够标识很多种状态,这些状态被定义成UIControl.State(normal,highlighted,disabled,selected,foucused,application,reserved)类型.我们能够根据app需要来以代码方式来改变控制器的状态.比如,我们可以使控制器不能响应事件来阻止用户与其交互.用户行为也能够改变控制器的状态.

1.2.Target-Acion机制

控制器使用target-action机制(后简称TA)通过我们写的代码来监听被关注的事件.TA简化我们编写的代码在App中来使用控制器.替代编写代码来追中事件,我们可以编写action方法来响应控制器的指定事件.比如我们可以编写action方法来响应slider的值变化.控制器处理所有工作来追踪即将到来的触摸事件并且决定何时来调用我们的方法.

当添加一个action方法给控制器时,我们指定action方法和一个定义了addTarget(_:action:for:)方法的对象(这些也可以在xib中配置).目标(target)对象可以是任何对象,但是它最典型的还是我们的view controller,一般情况下这个vc的根视图包含了控制器.如果我们指定nil给target对象,控制器就会通过响应者链来搜索定义了指定action方法的目标对象.

action方法的签名(signature)有以下三种:

@IBAction func doSomething()
@IBAction func doSomething(sender:UIButton)
@IBAction func doSomething(sender:UIButton, forEvent event:UIEvent)

sender参数与调用action方法的控制器(control)一致,event参数与控制器相关联事件出触发的UIEvent对象一致.

action方法当用户以特殊方法与control进行交互时被调用.UIControl.Event类型定义了用户能够报告而且这些行为大多数关联了控制器的特殊的触摸事件的控制器进行交互的事件.当配置控制器时候,我们必须指定哪些事件触发了我们的方法调用.比如按钮控制器,我们必须使用touchDown或者touchUpInside事件来触发调用我们的action方法.对于Slider,我们可能只需要关心其值的变化,所以我们只可能只需要绑定action方法到valueChaged事件上即可.

当一个特殊的控制器事件发生,控制器立刻调用任何关联的action方法.action方法通过当前的UIApplication对象进行分发,它可以根据响应者链找到适当的对象来处理消息.

2.代码示例

import UIKit

class CustomControl: UIControl {

    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

}


//
//  ViewController.swift
//  SwiftUIKitUIControlDemo
//
//  Created by ZhangYu on 2021/4/27.
//  Copyright © 2021 MyZone. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    let myControl : CustomCOntrol= CustomControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.view.addSubview(myControl)
        myControl.backgroundColor = UIColor.systemBlue
        myControl.translatesAutoresizingMaskIntoCOnstraints= false
        
        let cOnstraintV= NSLayoutConstraint.constraints(withVisualFormat: "V:|-100-[myControl(50)]", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myControl" : myControl])
        let cOnstraintH= NSLayoutConstraint.constraints(withVisualFormat: "H:|-50-[myControl(100)]", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myControl" : myControl])
        self.view.addConstraints(constraintV)
        self.view.addConstraints(constraintH)
        
        //添加事件
        myControl.addTarget(self, action: #selector(testAction), for: UIControl.Event.touchUpInside)
        
        print("myControl.state is (myControl.state)")
        
        print("myControl.allControlEvents is (myControl.allControlEvents)")
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.myControl.removeTarget(self, action: #selector(self.testAction), for: UIControl.Event.touchUpInside)
            print("myControl.allControlEvents is (self.myControl.allControlEvents)")
        }
        
        
    }

    
    //action事件
    @objc func testAction(){
        self.myControl.backgroundColor = UIColor.systemRed
        print("(#function) myControl.state is (myControl.state)")
    }

}


  • 工程下载地址:

https://github.com/DeveloperZhang/SwiftStudyDemo

3.总结

UIControl是一个最基础常见的视图类,可以参考文档进行深入学习:UIKit->Views and Controls->UIControl


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
author-avatar
justmoon999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有