1、效果演示
2、基本思路
2.1 使用storyboard将基本框架画出来,如图所示
2.2 新建一个xib,在xib中创建好需要添加到联系人列表的元素,实质为创建一个类(如RowView),将每行联系人记录当作一个对象处理
2.3 将RowView类创建一个初始化的类方法供外界调用,视图中的各个元素可通过类成员变量的形式展示并供外界访问
2.4 添加到主视图的哪个位置,添加及删除以何种形式进行这些都在主视图类中完成,封装思想;
3、关键代码
RowView.xib
SARowView.h- //
- // SARowView.h
- // ContactList
- //
- // Created by yusian on 14-3-29.
- // Copyright (c) 2014年 yusian. All rights reserved.
- //
- #import <UIKit/UIKit.h>
- @interface SARowView : UIView
- // 将xib上的三个子视图分别创建为该类的成员变量
- @property (weak, nonatomic) IBOutlet UIButton *iconButton;
- @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
- @property (weak, nonatomic) IBOutlet UIButton *deleteButton;
- // 提供一个类方法将xib提供给外界使用,并提供两个参数初始化对象
- + (id)rowViewWithIcon:(NSString *)iconName andLabelName:(NSString *)labelName;
- @end
复制代码 SARowView.m- //
- // SARowView.m
- // ContactList
- //
- // Created by yusian on 14-3-29.
- // Copyright (c) 2014年 yusian. All rights reserved.
- //
- #import "SARowView.h"
- @implementation SARowView
- + (id)rowViewWithIcon:(NSString *)iconName andLabelName:(NSString *)labelName
- {
- // 利用xib将绘制好的视图提供给方法调用者,并将视图中的元素(头像图片名、Label文件内容)通过参数的方式提供给外界访问
- SARowView *view = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil][0];
- [view.iconButton setImage:[UIImage imageNamed:iconName] forState:UIControlStateNormal];
- view.nameLabel.text = labelName;
- return view;
- }
- @end
复制代码 SAViewController.h- //
- // SAViewController.h
- // ContactList
- //
- // Created by yusian on 14-3-28.
- // Copyright (c) 2014年 yusian. All rights reserved.
- //
- #import <UIKit/UIKit.h>
- @interface SAViewController : UIViewController
- @property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem;
- - (IBAction)add:(UIBarButtonItem *)sender; // 增加一行
- - (IBAction)remove:(UIBarButtonItem *)sender; // 删除一行
- @end
复制代码 SAViewController.m- //
- // SAViewController.m
- // ContactList
- //
- // Created by yusian on 14-3-28.
- // Copyright (c) 2014年 yusian. All rights reserved.
- //
- #import "SAViewController.h"
- #import "SARowView.h"
- #define kSubviewHeight 50
- // 类扩展(class extension,匿名分类)
- @interface SAViewController ()
- {
- NSArray *_nameIndex;
- }
- @end
- @implementation SAViewController
- -(void)viewDidLoad
- {
- [super viewDidLoad];
- _nameIndex = @[@"赵一", @"钱二", @"孙三", @"李四", @"周五", @"吴六", @"郑七", @"王八", @"张九", @"余十"];
- }
- #pragma mark 增加联系人
- - (IBAction)add:(UIBarButtonItem *)sender {
-
- self.removeItem.enabled = YES; // 只要触发添加联系人事件,即将删除按钮可用性设置为enable
- int random = arc4random_uniform(9); // 创建0-9十个随机数;
- NSString *imageName = [NSString stringWithFormat:@"%d.png", random]; //利用随机数创建十张随机图片
- NSString *labelName = _nameIndex[random]; // 从_nameIndex(viewDidLoad中有定义)数组中取出随机取出一个字符串
-
- // 创建一个SARowView类型的视图,并初始化icon和labelName随机
- SARowView *subview = [SARowView rowViewWithIcon:imageName andLabelName:labelName];
- // 确定subView摆放位置,即新添加的subView为上一个子控件(subViews的最后一个子控件)的y值加控件高度
- UIView *lastObject = [self.view.subviews lastObject]; // 取出最后一个子控件
- CGFloat lastObjHeight = lastObject.frame.size.height; // 最后一个子控件的高度
- CGFloat lastObjY = lastObject.frame.origin.y; // 最后一个子控件的y值
- CGFloat superviewWidth = self.view.frame.size.width; // 父控件的宽度
- CGFloat animateDistance = kSubviewHeight; // 动画移动距离
- CGFloat subviewY = lastObjY + lastObjHeight + 1 + animateDistance; // 新添加子控件的y值
- subview.frame = CGRectMake(0, subviewY, superviewWidth, kSubviewHeight); // 初始化子控件位置
- subview.alpha = 0; // 初始化子控件透明度为100%,为动画淡出效果做准备
-
- // 动画范围,{}内的数据变动将以动画形式完成
- [UIView animateWithDuration:0.5 animations:^{
-
- // 该subView的y值上移一个动画移动距离,经过动画移动到该放的位置
- CGRect tempRect = subview.frame;
- tempRect.origin.y -= animateDistance;
- subview.frame = tempRect;
-
- // 将透明度设置为1,淡出效果
- subview.alpha = 1;
-
- }];
-
- // 添加到View
- [self.view addSubview:subview];
- // 添加两个按钮事件(头像点击与删除键点击)
- [subview.iconButton addTarget:self action:@selector(iconClink:) forControlEvents:UIControlEventTouchUpInside];
- [subview.deleteButton addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];
- }
- #pragma mark 删除联系人
- - (IBAction)remove:(UIBarButtonItem *)sender {
-
- // 取出最后一个UIView元素
- UIView *lastSubview = [self.view.subviews lastObject];
-
- // 以下代码均为动画演示代码相关
- CGRect lastRect = lastSubview.frame;
- lastRect.origin.y = self.view.frame.size.height;
- [UIView animateWithDuration:0.5 animations:^{
- lastSubview.frame = lastRect; // 最终动画效果下移到整个视图最底端并淡出;
- lastSubview.alpha = 0;
- } completion:^(BOOL finished) {
-
- // 删除最后一个UIView元素,
- [lastSubview removeFromSuperview];
- self.removeItem.enabled = self.view.subviews.count > 1; // 判断如果只剩下UIToolBar了,则将删除按钮变灰
- }];
-
- }
- #pragma mark 联系人头像按钮
- - (void)iconClink:(UIButton *)sender
- {
- // 如果点击了头像按钮,则打印出当前头像所在视图的nameLabelmwpq
- SARowView *superView = (SARowView *)sender.superview;
- NSLog(@"%@", superView.nameLabel.text);
- }
- #pragma mark 联系人删除按钮
- - (void)deleteClick:(UIButton *)btn
- {
- //**********动画淡出删除效果开始******
-
- [UIView animateWithDuration:0.5 animations:^{
- CGRect tempF = btn.superview.frame;
- tempF.origin.x += 320;
- btn.superview.frame = tempF;
- btn.superview.alpha = 0;
- } completion:^(BOOL finished) {
-
- //**********动画结束*****************
-
- //删除中间某行后,后续行往上移一个行距,嵌套一个动画
- [UIView animateWithDuration:0.5 animations:^{
- NSInteger index = [self.view.subviews indexOfObject:btn.superview];
-
- // 对象方法将自己从父视图中移出
- [btn.superview removeFromSuperview];
- self.removeItem.enabled = self.view.subviews.count > 1; // 判断当前是否为最后一个子控件,是否将删除键变灰
-
- // 利用循环将后续所有的对象往上移动一个行间距
- for (NSInteger i = index; i < self.view.subviews.count; i++) {
- UIView *temp = self.view.subviews[i];
- CGRect tempFrame = temp.frame;
- tempFrame.origin.y -= 51;
- temp.frame = tempFrame;
- }
- }];
- }];
- }
- @end
复制代码 4、源代码下载
游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0
5、参考链接
图片与按钮示例:ios实战开发之汤姆猫
ios实战开发之UISegmentedControl
|