UIControl的使用

在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,

内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞”和“取消赞”切换时的效果。

可是我们又很需要UIButton似的事件响应机制。

怎么办?

对! 就是使用UIControl。

UIControl在这里有两个突出的优势:

1.作为UIButton的父控件,具有UIButton一样的事件响应机制

2.作为UIView的简单子控件,具有作为容器视图的潜质

设计思路:实现一个自定义控件,继承UIControl,里面包含一些视图,包含什么视图由你的需求决定,我的是两张图片。 然后在事件响应时,两张图片进行切换。切换动画可以自定义。这样就实现了一个切换效果自由度很大的点赞按钮哦!

参考代码如下:

[objc] view plaincopyprint?

  1. #import <UIKit/UIKit.h>
  2. typedef NS_ENUM(NSInteger, UIControlFlagMode) {
  3. FlagModelNO,
  4. FlagModelYES,
  5. FlagModelDefalt
  6. };
  7. @interface UIControlFlagView : UIControl
  8. @property (nonatomic, strong) UIImage*noStateImg;
  9. @property (nonatomic, strong) UIImage*yesStateImg;
  10. @property (nonatomic, strong) UIImage*defaultStateImg;
  11. @property (nonatomic, assign) UIControlFlagMode flag;
  12. - (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation;
  13. @end

m文件:

[objc] view plaincopyprint?

  1. #import "UIControlFlagView.h"
  2. @interface UIControlFlagView()
  3. @property (nonatomic, strong) UIImageView*noStateImgV;
  4. @property (nonatomic, strong) UIImageView*yesStateImgV;
  5. @property (nonatomic, strong) UIImageView*defaultStateImgV;
  6. @end
  7. @implementation UIControlFlagView
  8. - (id)initWithFrame:(CGRect)frame
  9. {
  10. self = [super initWithFrame:frame];
  11. if (self) {
  12. // Initialization code
  13. }
  14. return self;
  15. }
  16. - (void)setNoStateImg:(UIImage *)noStateImg
  17. {
  18. if (!self.noStateImgV)
  19. {
  20. self.noStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
  21. self.noStateImgV.contentMode = UIViewContentModeCenter;
  22. [self addSubview:self.noStateImgV];
  23. self.flag = FlagModelNO;//default style
  24. }
  25. self.noStateImgV.image = noStateImg;
  26. _noStateImg = noStateImg;
  27. }
  28. - (void)setYesStateImg:(UIImage *)yesStateImg
  29. {
  30. if (!self.yesStateImgV)
  31. {
  32. self.yesStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
  33. self.yesStateImgV.contentMode = UIViewContentModeCenter;
  34. [self addSubview:self.yesStateImgV];
  35. self.yesStateImgV.alpha = 0.0;
  36. }
  37. self.yesStateImgV.image = yesStateImg;
  38. _yesStateImg = yesStateImg;
  39. }
  40. - (void)setDefaultStateImg:(UIImage *)defaultStateImg
  41. {
  42. if (!self.defaultStateImgV)
  43. {
  44. self.defaultStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
  45. self.defaultStateImgV.contentMode = UIViewContentModeCenter;
  46. [self addSubview:self.defaultStateImgV];
  47. }
  48. self.defaultStateImgV.image = defaultStateImg;
  49. _defaultStateImg = defaultStateImg;
  50. }
  51. - (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation
  52. {
  53. if (animation)
  54. {
  55. //no-->yes
  56. if (_flag == FlagModelNO && flag == FlagModelYES)
  57. {
  58. self.yesStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
  59. [UIView animateWithDuration:0.3 animations:^{
  60. self.noStateImgV.alpha = 0.0;
  61. self.yesStateImgV.alpha = 1.0;
  62. self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  63. self.noStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
  64. }
  65. completion:^(BOOL finished)
  66. {
  67. self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  68. self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  69. }];
  70. }
  71. //yes-->no
  72. else if(_flag == FlagModelYES && flag == FlagModelNO)
  73. {
  74. self.noStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
  75. [UIView animateWithDuration:0.3 animations:^{
  76. self.noStateImgV.alpha = 1.0;
  77. self.yesStateImgV.alpha = 0.0;
  78. self.yesStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
  79. self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  80. }
  81. completion:^(BOOL finished)
  82. {
  83. self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  84. self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  85. }];
  86. }
  87. }
  88. else
  89. {
  90. //no-->yes
  91. if (_flag == FlagModelNO && flag == FlagModelYES)
  92. {
  93. self.noStateImgV.alpha = 0.0;
  94. self.yesStateImgV.alpha = 1.0;
  95. self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  96. self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  97. }
  98. //yes-->no
  99. else if(_flag == FlagModelYES && flag == FlagModelNO)
  100. {
  101. self.noStateImgV.alpha = 1.0;
  102. self.yesStateImgV.alpha = 0.0;
  103. self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  104. self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
  105. }
  106. }
  107. _flag = flag;
  108. }
  109. @end

这是一个简单的实现,最大的优势,也是这篇文章的目的,就是在切换效果上的自定义和自由度!

抛砖引玉,希望大家都能做出复合自己心中所想的点赞按钮!

时间: 2024-10-14 04:42:11

UIControl的使用的相关文章

ios中UIControl详解

上篇讲到了UITouch和UIEvent事件,简单回顾一下,UIEvent是一系列UITouch的集合,在IOS中负责响应触摸事件.另外还提到了响应者链的概念,在IOS中,所有事件有一个最先响应者,事件可以沿着响应者链向下传递. 接下来是UIControl对象 UIControl是UIView的子类,当然也是UIResponder的子类.UIControl是诸如UIButton.UISwitch.UITextField等控件的父类,它本身也包含了一些属性和方法,但是不能直接使用UIControl

UIControl

UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedControl分段控件.UISlider滑块.UITextField文本字段控件. UIPageControl分页控件. 控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏.表格单元,甚至更大的对象. 这些控件的基类均是UIControl,而UIControl派生自UIView类,所以每个控件都有很多视图的特性,包括附着于其他视图的能力.所有 控件都拥有一套共同的属性和方法. 所以学习控件

UI第六讲.UISegmentControl的使用,UISliser的使用,UIImageView的使用,UIControl的作用

一.UISegmentedControl的使用(分段控件) UISegmentedControl是iOS中的分段控件. 每个segment都能被点击,相当于集成了若干个button.通常我们会点击不同的segment来切换不同的view. 示例图: 常用方法: 示例代码: 基本的UISegmentControl的用法,同时通过其addtarget/action方法实点击切换view背景色的效果 效果图:点击UISegmentControl的item,切换背景色 二.UISlider的使用(滑块控

UI控件之UIControl

一,概述 ios开发过中,我们常常需要使用一些控件,来搭建我们的界面.有时系统为我们提供的控件并不能满足我们的需求,这时我们需要自己封装一些控件.因此我们就需要了解一些控件基类的特性,方便我们封装操作.比如说,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedControl分段控件.UISlider滑块.UITextField文本字段控件. UIPageControl分页控件等,这些控件的基类均是UIControl.了解UIControl对我们封装类似U

iOS:转载:UIControl的使用

主要功能: UIContol(控件是所有控件的基类 如:(UIButton)按钮主要用于与用户交互,通常情况下我们不会直接使用UIControl,而是子类化它. 常用属性: BOOL enabled 空间默认是启用的,要禁用控件,可以将enabled属性设置为NO,这样将导致控件会略任何触摸控件事件.被禁用后,控件还可以用不同的方式显示自己, 比如变成灰色不可用.由空间的子类完成的,这个属性却存在于UIControl中. 实例演示: UIButton *button = [[UIButton a

Target Action And UIControl

Target Action And UIControl target-action的设计模式 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(135, 100, 80, 40); [button setTitle:@"??" forState:UIControlStateNormal]; button.backgroundColor = [UIColor

Objective-C:转载:UIControl的使用

主要功能: UIContol(控件是所有控件的基类 如:(UIButton)按钮主要用于与用户交互,通常情况下我们不会直接使用UIControl,而是子类化它. 常用属性: BOOL enabled 空间默认是启用的,要禁用控件,可以将enabled属性设置为NO,这样将导致控件会略任何触摸控件事件.被禁用后,控件还可以用不同的方式显示自己, 比如变成灰色不可用.由空间的子类完成的,这个属性却存在于UIControl中. 实例演示: UIButton *button = [[UIButton a

UIControl及其子类

UIControl是有控制功能的视图的父类,只要跟控制有关的控件都是继承于该类,UIControl这个类通常我们并不直接使用,而是使用其子类,以下介绍一些它的子类 UISlider: UISegmentedControl:(当图片显示不出来的时候,可以改变图片的模式为: imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal) UISwitch UIPageControl

UIControl IOS控件编程 及UITextField的讲解

第一部分 UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedControl分段控件.UISlider滑块.UITextField文本字段控件.UIPageControl分页控件. 控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏.表格单元,甚至更大的对象. 这些控件的基类均是UIControl,而UIControl派生自UIView类,所以每个控件都有很多视图的特性,包括附着于其他视图的能力.所有控件都拥有一套共同的属性和方法. 所以学

ios控件 UIControl

< UIControl> 1 处理用户事件的控件的基类,如UIButton,UISlider等 2 一般不直接实例化,而是使用他的子类 3 可以通过跟踪触摸事件来设置和获取控件状态,并且这些方法可以被子类继承 //添加一个事件 - (void)addTarget:(id)target action:(SEL)action forControlEvents: (UIControlEvents)controlEvents; //移除一个事件 - (void)removeTarget:(id)tar