前几天一直在忙项目三,没来的及更新微博,今天来和大家分享些东西,也是从网上看到的,觉得挺基础但挺重要的
1.加载RowView.xib文件,创建Objects下面的所有控件:
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil];
2.取出xib中的第一个子控件:
UIView *rowView = views[0];
3.设置头像
UIButton *icon = (UIButton *)[rowView viewWithTag:1];
NSString *iconName = [NSString stringWithFormat:@"01%d.png", arc4random_uniform(9)];
[icon setImage:[UIImage imageNamed:iconName] forState:UIControlStateNormal];
4.设置姓名
UILabel *name = (UILabel *)[rowView viewWithTag:2];
name.text = _allNames[arc4random_uniform(_allNames.count)];
5.监听删除按钮
UIButton *delete = (UIButton *)[rowView viewWithTag:3];
[delete addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];
方法/步骤
-
MJViewController.h
#import <UIKit/UIKit.h>
@interface MJViewController : UIViewController
{
}
// 添加
- (IBAction)add:(UIBarButtonItem *)sender;
// 删除
- (IBAction)remove:(UIBarButtonItem *)sender;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem;
@end
-
MJViewController.m
#import "MJViewController.h"
#define kDuration 0.5
#define kRowH 50
#define kNameTag 10
// 类扩展(class extension,匿名分类)
@interface MJViewController ()
{
NSArray *_allNames;
}
@end
@implementation MJViewController
#pragma mark 控制器的view加载完毕的时候调用一次
- (void)viewDidLoad
{
[super viewDidLoad];
_allNames = @[@"西门庆", @"东门庆", @"北门庆", @"南门庆", @"中门庆"];
}
#pragma mark 添加一行
- (IBAction)add:(UIBarButtonItem *)sender {
// 0.取出最后一个子控件
UIView *last = [self.view.subviews lastObject];
// 这行的Y = 最后一个子控件的Y + 最后一个子控件的高度 + 间距
CGFloat rowY = last.frame.origin.y + last.frame.size.height + 1;
// 1.创建一行
UIView *rowView = [self createRowView];
// 2.添加一行到控制器的view中
[self.view addSubview:rowView];
// 3.让删除item有效
_removeItem.enabled = YES;
// 4.执行动画
rowView.frame = CGRectMake(320, rowY, 320, kRowH);
rowView.alpha = 0;
// 4.1.开始动画
[UIView animateWithDuration:kDuration animations:^{
rowView.frame = CGRectMake(0, rowY, 320, kRowH);
rowView.alpha = 1;
}];
}
#pragma mark 创建一行(从xib中加载一行的view)
// xib == nib
- (UIView *)createRowView
{
// 1.加载RowView.xib文件,创建Objects下面的所有控件,并且按顺序装到数组中返回
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil];
// 2.取出一行的红色view
UIView *rowView = views[0];
// 3.设置头像
UIButton *icon = (UIButton *)[rowView viewWithTag:1];
NSString *iconName = [NSString stringWithFormat:@"01%d.png", arc4random_uniform(9)];
[icon setImage:[UIImage imageNamed:iconName] forState:UIControlStateNormal];
// 4.设置姓名
UILabel *name = (UILabel *)[rowView viewWithTag:2];
name.text = _allNames[arc4random_uniform(_allNames.count)];
// 5.监听删除按钮
UIButton *delete = (UIButton *)[rowView viewWithTag:3];
[delete addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];
return rowView;
}
#pragma mark 监听删除按钮点击
- (void)deleteClick:(UIButton *)btn
{
[UIView animateWithDuration:kDuration animations:^{
CGRect tempF = btn.superview.frame;
tempF.origin.x = 320;
btn.superview.frame = tempF;
btn.superview.alpha = 0;
} completion:^(BOOL finished) {
// 1.获得即将删除的这行在数组中的位置
int startIndex = [self.view.subviews indexOfObject:btn.superview];
// 2.删除当前行
[btn.superview removeFromSuperview];
[UIView animateWithDuration:0.3 animations:^{
// 3.遍历后面的子控件
for (int i = startIndex; i<self.view.subviews.count; i++) {
UIView *child = self.view.subviews[i];
CGRect tempF = child.frame;
tempF.origin.y -= kRowH + 1;
child.frame = tempF;
}
}];
// 4.判断垃圾桶
_removeItem.enabled = self.view.subviews.count > 1;
}];
}
#pragma mark 监听头像按钮点击
- (void)iconClick:(UIButton *)btn
{
// 1.取得按钮的父控件(因为label和btn处在同一个父控件中)
// btn.superview;
// 2.获得文本标签
UILabel *label = (UILabel *)[btn.superview viewWithTag:kNameTag];
// 3.打印
NSLog(@"名字是:%@", label.text);
}
#pragma mark 删除一行
- (IBAction)remove:(UIBarButtonItem *)sender {
// 1.取出最后一个子控件
UIView *last = [self.view.subviews lastObject];
[UIView animateWithDuration:kDuration animations:^{
CGRect tempF = last.frame;
tempF.origin.x = 320;
last.frame = tempF;
last.alpha = 0;
} completion:^(BOOL finished) {
[last removeFromSuperview];
// 剩下的子控件个数 > 1就能够点击“删除”
_removeItem.enabled = self.view.subviews.count > 1;
}];
}
@end
-