iOS自定义控件一
发布日期:2022-03-18 08:27:40 浏览次数:36 分类:技术文章

本文共 4975 字,大约阅读时间需要 16 分钟。

文章内容来自学习系列课程

第一个自定义控件

这个自定义控件是一个简单的自定义View,左边是一个UIImageView,右边是一个LabelIconControl的代码如下,包括设置约束:

class IconControl: UIView {    private lazy var imageView: UIImageView = {        let iv = UIImageView()        iv.translatesAutoresizingMaskIntoConstraints = false        return iv    }()    private var label: UILabel = {        let label = UILabel()        label.translatesAutoresizingMaskIntoConstraints = false        label.font = UIFont.systemFontOfSize(30.0, weight: UIFontWeightLight)        return label    }()    private  var spacingConstraint: NSLayoutConstraint!    var spacing: CGFloat = 20.0 {        didSet{            spacingConstraint!.constant = spacing        }    }    override init(frame: CGRect) {        super.init(frame: frame)        sharedInitalizaiton()    }    required init?(coder aDecoder: NSCoder) {        super.init(coder: aDecoder)        sharedInitalizaiton()    }}extension IconControl {    var image: UIImage? {        get {            return imageView.image        }        set(newImage) {            imageView.image = newImage?.imageWithRenderingMode(.AlwaysTemplate)        }    }    var text: String? {        get {            return label.text        }        set(newText) {            label.text = newText        }    }}extension IconControl {    private func sharedInitalizaiton() {        translatesAutoresizingMaskIntoConstraints = false        addSubview(label)        addSubview(imageView)        //创建约束 间隔        spacingConstraint = label.leftAnchor.constraintEqualToAnchor(imageView.rightAnchor, constant: spacing)        NSLayoutConstraint.activateConstraints([            imageView.leadingAnchor.constraintEqualToAnchor(layoutMarginsGuide.leadingAnchor),            imageView.topAnchor.constraintEqualToAnchor(layoutMarginsGuide.topAnchor),            imageView.bottomAnchor.constraintEqualToAnchor(layoutMarginsGuide.bottomAnchor),            spacingConstraint,            label.rightAnchor.constraintEqualToAnchor(layoutMarginsGuide.rightAnchor),            imageView.centerYAnchor.constraintEqualToAnchor(label.centerYAnchor)            ])        //设置如何压缩和拉伸        label.setContentHuggingPriority(UILayoutPriorityDefaultHigh, forAxis: .Horizontal)        imageView.setContentHuggingPriority(UILayoutPriorityDefaultHigh, forAxis: .Horizontal)        setContentHuggingPriority(UILayoutPriorityDefaultHigh, forAxis: .Horizontal)        layer.cornerRadius = 10    }}

在ViewController上添加view,并设置约束:

lazy var iconControl: IconControl = {  return IconControl(frame: .zero)}()---iconControl.text = "My Icon Controld"iconControl.image = UIImage(named: "cocktail")iconControl.spacing = 50.0iconControl.backgroundColor = UIColor(white: 0.9, alpha: 1.0)view.addSubview(iconControl)NSLayoutConstraint.activateConstraints([    iconControl.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor),    iconControl.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)    ])

效果如下:

效果

与Interface Builder整合

自定义控件与Interface Builder整合

  • 在class上添加@IBDesignable
  • 在需要的property上添加@IBInspectable

这样就可以通过在Interface Builder中设置对应的属性值

Interaction和UIControl

在Cocoa Touch中公有5中interaction方式

  • Target-Action 用于UIControl、UIView的子类
  • Delegation代理
  • Command Pattern,例如传递闭包
  • Notification
  • Key-Value Observation

最简单是Target-Action

public class UIControl : UIView {    //...    public func addTarget(target: AnyObject?, action: Selector,    forControlEvents controlEvents: UIControlEvents)    public func removeTarget(target: AnyObject?, action: Selector,    forControlEvents controlEvents: UIControlEvents)    //...    public func sendAction(action: Selector, to target: AnyObject?,    forEvent event: UIEvent?)    public func sendActionsForControlEvents(controlEvents: UIControlEvents)}

所以要让IconControl可以交互,可以让IconControl继承自UIControl,而不是UIView。这样就可以像按钮一样给它添加事件:

添加事件

同样可以给IconControl添加UITapGestureRecognizer,并触发.TouchUpInside对应的Action方法。

如何实现Button一样的效果,在点击时IconControl有外观上的变化?
在本例中,使用的是重写touchesBegan等一系列方法,并改变tintAdjustmentMode,然后重写tintColorDidChange方法,做出对应的改变

extension IconControl {  override func tintColorDidChange() {    super.tintColorDidChange()    label.textColor = tintColor  }}extension IconControl {  private func addTapGestureRecognizer() {    let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: "handleIconTapped:")    addGestureRecognizer(tapGestureRecogniser)  }  func handleIconTapped(sender: UITapGestureRecognizer) {    sendActionsForControlEvents(.TouchUpInside)  }  override func touchesBegan(touches: Set
, withEvent event: UIEvent?) { animateTintAdjustmentMode(.Dimmed) } override func touchesCancelled(touches: Set
?, withEvent event: UIEvent?) { animateTintAdjustmentMode(.Normal) } override func touchesEnded(touches: Set
, withEvent event: UIEvent?) { animateTintAdjustmentMode(.Normal) } private func animateTintAdjustmentMode(mode: UIViewTintAdjustmentMode) { UIView.animateWithDuration(mode == .Normal ? 0.3 : 0.05) { self.tintAdjustmentMode = mode } }}

点击效果如下:

点击效果

转载地址:https://windzen.blog.csdn.net/article/details/53407049 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Swift-泛型
下一篇:CALayer相关文章

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月25日 17时45分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mysql树形递归删除_使用递归删除树形结构的所有子节点(java和mysql实现) 2019-04-21
linux mysql 不能连接远程_linux mysql 远程连接 2019-04-21
mysql $lt_mongodb中比较级查询条件:($lt $lte $gt $gte)(大于、小于)、查找条件... 2019-04-21
install python_Install python on AIX 7 2019-04-21
jquery查找div下第一个input_jquery查找div元素第一个元素id 2019-04-21
如何修改手机屏幕显示的长宽比例_屏幕分辨率 尺寸 比例 长宽 如何计算 2019-04-21
mysql 的版本 命名规则_MySQL版本和命名规则 2019-04-21
no java stack_Java Stack contains()用法及代码示例 2019-04-21
java动态代码_Java Agent入门学习之动态修改代码 2019-04-21
python集合如何去除重复数据_Python 迭代删除重复项,集合删除重复项 2019-04-21
iview 自定义时间选择器组件_Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能... 2019-04-21
java 验证码校验_JavaWeb验证码校验功能代码实例 2019-04-21
java多线程初学者指南_Java多线程初学者指南(4):线程的生命周期 2019-04-21
java进程user是jenkins_java 学习:在java中启动其他应用,由jenkins想到的 2019-04-21
java添加资源文件_如何在eclipse中将资源文件夹添加到我的Java项目中 2019-04-21
java的三种修饰符_3分钟弄明白JAVA三大修饰符 2019-04-21
mysql source skip_redis mysql 中的跳表(skip list) 查找树(btree) 2019-04-21
java sun.org.mozilla_maven编译找不到符号 sun.org.mozilla.javascript.internal 2019-04-21
php curl 输出到文件,PHP 利用CURL(HTTP)实现服务器上传文件至另一服务器 2019-04-21
PHP字符串运算结果,PHP运算符(二)"字符串运算符"实例详解 2019-04-21