基于UIControl控件实现ios点赞功能_IOS

在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞”和“取消赞”切换时的效果。
可是我们又很需要UIButton似的事件响应机制。

怎么办?

对! 就是使用UIControl。

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

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

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

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

参考代码如下:

#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, UIControlFlagMode) {
  FlagModelNO,
  FlagModelYES,
  FlagModelDefalt
};
@interface UIControlFlagView : UIControl
@property (nonatomic, strong) UIImage*noStateImg;
@property (nonatomic, strong) UIImage*yesStateImg;
@property (nonatomic, strong) UIImage*defaultStateImg;
@property (nonatomic, assign) UIControlFlagMode flag;
- (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation;
@end 

m文件:

#import "UIControlFlagView.h"
@interface UIControlFlagView()
@property (nonatomic, strong) UIImageView*noStateImgV;
@property (nonatomic, strong) UIImageView*yesStateImgV;
@property (nonatomic, strong) UIImageView*defaultStateImgV;
@end
@implementation UIControlFlagView
- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    // Initialization code
  }
  return self;
}
- (void)setNoStateImg:(UIImage *)noStateImg
{
  if (!self.noStateImgV)
  {
    self.noStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
    self.noStateImgV.contentMode = UIViewContentModeCenter;
    [self addSubview:self.noStateImgV];
    self.flag = FlagModelNO;//default style
  }
  self.noStateImgV.image = noStateImg;
  _noStateImg = noStateImg;
}
- (void)setYesStateImg:(UIImage *)yesStateImg
{
  if (!self.yesStateImgV)
  {
    self.yesStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
    self.yesStateImgV.contentMode = UIViewContentModeCenter;
    [self addSubview:self.yesStateImgV];
    self.yesStateImgV.alpha = 0.0;
  }
   self.yesStateImgV.image = yesStateImg;
  _yesStateImg = yesStateImg;
}
- (void)setDefaultStateImg:(UIImage *)defaultStateImg
{
  if (!self.defaultStateImgV)
  {
    self.defaultStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
    self.defaultStateImgV.contentMode = UIViewContentModeCenter;
    [self addSubview:self.defaultStateImgV];
  }
  self.defaultStateImgV.image = defaultStateImg;
  _defaultStateImg = defaultStateImg;
}
- (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation
{
  if (animation)
  {
    //no-->yes
    if (_flag == FlagModelNO && flag == FlagModelYES)
    {
     self.yesStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
     [UIView animateWithDuration:0.3 animations:^{
       self.noStateImgV.alpha = 0.0;
       self.yesStateImgV.alpha = 1.0;
       self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
       self.noStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
     }
    completion:^(BOOL finished)
    {
       self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
       self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
     }];
    }
    //yes-->no
    else if(_flag == FlagModelYES && flag == FlagModelNO)
    {
      self.noStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
      [UIView animateWithDuration:0.3 animations:^{
        self.noStateImgV.alpha = 1.0;
        self.yesStateImgV.alpha = 0.0;
        self.yesStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
        self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
      }
       completion:^(BOOL finished)
       {
         self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
         self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
       }];
    }
  }
  else
  {
    //no-->yes
    if (_flag == FlagModelNO && flag == FlagModelYES)
    {
        self.noStateImgV.alpha = 0.0;
        self.yesStateImgV.alpha = 1.0;
        self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
        self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
    }
    //yes-->no
    else if(_flag == FlagModelYES && flag == FlagModelNO)
    {
      self.noStateImgV.alpha = 1.0;
      self.yesStateImgV.alpha = 0.0;
      self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
      self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
    }
  }
   _flag = flag;
}
@end

这是一个简单的实现,最大的优势,也是这篇文章的目的,就是在切换效果上的自定义和自由度!
抛砖引玉,希望大家都能做出复合自己心中所想的点赞按钮!

希望大家对本文所述感兴趣。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ios点赞功能实现
, ios点赞实现
, ios点赞功能代码
ios点赞功能
java点赞功能实现、点赞功能实现、android 点赞功能实现、js实现点赞功能、网页点赞功能实现代码,以便于您获取更多的相关知识。

时间: 2024-09-15 05:56:42

基于UIControl控件实现ios点赞功能_IOS的相关文章

基于Lodop控件的Web打印示例(含源码)

      最近项目组的打印控件有所改变,已经换成Lodop控件,使用以后发现,功能确实非常强大.可以打印Web页面内某个控件的内容.下面,还是通过一个实例来说明下吧,医院系统有个模块,是院内感染模块,它需要填写各种报卡,并且填写完以后,要将它打印出来,而且打印出来的效果要和纸制的报卡近乎一致.额,这个要求就比较高喽,如图-1所示,这是其中一张报卡的纸制扫描效果图,我们打印出来的效果要和这个几乎一样. 图-1       现在我们来分析一下这里的打印展示类型.       类型1:患者姓名,卡片

ASP.NET:DataList控件的分列输出功能

asp.net|控件 DataList 控件在一个重复列表中显示数据项,并且还可以支持选择和编辑项目.可使用模板对 DataList 中列表项的内容和布局进行定义,它的最大的特点是可以分列显示数据.下面几节里,我们将详细介绍.     9.3  DataList控件的详解     9.3.1 DataList控件的分列输出功能     DataList控件被设计为用于分列输出数据,需要输出的数据在它的<ItemTemplate>属性里,每一个<Blockquote>就是一个强制换行

ASP.NET:DataList控件的选择输入功能

asp.net|控件     利用DataList控件的<SelectedItemTemplate> 属性,就可以随心所欲的布置表中的数据.根据链接,友好地显示出用户感兴趣的数据,我们来看下面的实例.     9.3.2 DataList控件的选择输入功能     在DataCon Web 项目里添加一个Web 窗体,命名为DataList_Sample2.aspx,添加一个DataList控件,DataList_Sample2.aspx的主要HTML代码如下: <form id=&qu

iOS自定义日历控件的简单实现过程_IOS

因为程序要求要插入一个日历控件,该空间的要求是从当天开始及以后的六个月内的日历,上网查资料基本上都说只要获取两个条件(当月第一天周几和本月一共有多少天)就可以实现一个简单的日历,剩下的靠自己的简单逻辑就OK了,下面开始自己从开始到完成的整个过程 1.首先做NSDate类目,扩展一些方法让日期之间转换更加方便 #import <Foundation/Foundation.h> @interface NSDate (LYWCalendar) #pragma mark - 获取日 - (NSInte

iOS应用开发中使用UIScrollView控件来实现图片缩放_IOS

一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 (2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容 (3)普通的UIView不具备滚动功能,不能显⽰示过多的内容 (4)UIScrollView是一个能够滚动的视图控件,可以⽤用来展⽰示⼤大量的内容,并且可以通过滚 动查看所有的内容  (5)  举例:手机上的"设置".其他⽰示例程序 2.UIScroll

Android编程实现点击EditText之外的控件隐藏软键盘功能

本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能.分享给大家供大家参考,具体如下: 工具类 ... public static void hideKeyboard(Context ctx) { if (ctx != null) { View view = ((Activity) ctx).getCurrentFocus(); if (view != null) { InputMethodManager inputManager = (InputMethodMana

iOS开发UI篇—UIScrollView控件实现图片缩放功能

一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理.也就是说,要完成缩放功能的话,只需要将需要缩放的内容添加到UIScrollView中 2.缩放原理 当用户在UIScrollView身上使用捏合手势时,UIScrollView会给代理发送一条消息,询问代理究竟要缩放自己内部的哪一个子控件(哪一块内容) 当用户在UIScrollView身上使用捏合手势时,UIScrollView会调用代理的v

详解iOS开发中UItableview控件的数据刷新功能的实现_IOS

实现UItableview控件数据刷新一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运行界面: 点击选中行: 修改数据后自动刷新: 三.代码示例 数据模型部分: YYheros.h文件 复制代码 代码如下: // //  YYheros.h //  10-英雄展示(数据刷新) // //  Created by apple on 14-5-29. //  Copyright (c) 2014年 itca

iOS App中UIPickerView选择栏控件的使用实例解析_IOS

UIPickerView控件是比UIDatePicker控件更普通的Picker控件,UIDatePicker控件可以理解成是从UIPickerView控件加工出来的专门进行日期选择的控件. UIPickerView控件的用法比UIDatePicker复杂一点.本文中的小例子将用UIPickerView控件做出两种效果,第一个只有一个转盘,第二个有两个转盘,但这两个转盘之间没有依赖关系,也就是说改变其中一个转盘中的选择,不会对第二个转盘产生影响.在下一篇文章会做一个转盘之间有依赖关系的例子. 下