Swift
import UIKit
let MARGINE: CGFloat = 20
let BUTTON_WIDTH: CGFloat = 80
let BUTTON_HEIGHT: CGFloat = 30
let CELL_WIDTH: CGFloat = 100
let CELL_HEIGHT: CGFloat = 40
class ViewController: UIViewController {
var btnIndex = 0
// 创建一个NSMutableArray集合,用于保存多个按钮
var btnArr = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
addlongPress()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension ViewController{
func addlongPress(){
// 创建一个手势处理器,用于检测、处理长按手势
let gesture = UILongPressGestureRecognizer(target: self, action: "longPress:")
// 为该控件添加手势处理器
self.view.addGestureRecognizer(gesture)
}
func longPress(gesture: UILongPressGestureRecognizer){
// 创建一个按钮
let btn = UIButton(type: .Custom)
//设置颜色
btn.backgroundColor = UIColor.grayColor()
// 获取NSArray中已经包含了几个按钮
let count = btnArr.count
// 计算当前添加的按钮位于第几行、第几列
let row = count / 3
let col = count % 3
// 为该按钮设置文本
btn.setTitle("按钮\(btnIndex)", forState: .Normal)
// 设置该bn按钮的大小和位置
btn.frame = CGRectMake(MARGINE + CGFloat(col) * CELL_WIDTH,CGFloat(row) * CELL_HEIGHT + MARGINE, BUTTON_WIDTH , BUTTON_HEIGHT)
// 为该按钮添加事件处理方法
btn.addTarget(self, action: "remove", forControlEvents: .TouchUpInside)
// 将按钮添加到应用界面的UIView控件中
self.view .addSubview(btn)
//存入数组
btnArr.addObject(btn)
btnIndex++
}
func remove(sender: AnyObject){
// 删除事件源控件(激发该事件的按钮)
sender.removeFromSuperview()
// 将触发该事件的按钮从NSMutableArray集合中删除
btnArr .removeObject(sender)
self.rearrange()
}
func rearrange(){
// 重新计算每个按钮的大小和位置
for var i = 0 ; i < btnArr.count; i++
{
let row = i / 3
let col = i % 3
let btn = btnArr.objectAtIndex(i) as! UIButton
btn.frame = CGRectMake(MARGINE + CGFloat(col) * CELL_WIDTH, CGFloat(row) * CELL_HEIGHT + MARGINE , BUTTON_WIDTH , BUTTON_HEIGHT)
}
}
}
Objective-C
#import "FKViewController.h"
#define MARGINE 20
#define BUTTON_WIDTH 80
#define BUTTON_HEIGHT 30
#define CELL_WIDTH 100
#define CELL_HEIGHT 40
@interface FKViewController ()
{
NSInteger btnIndex;
NSMutableArray* btnArr;
}
@end
@implementation FKViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self addlongPress];
}
- (void)addlongPress
{
// 创建一个NSMutableArray集合,用于保存多个按钮
btnArr = [[NSMutableArray alloc] init];
// 创建一个手势处理器,用于检测、处理长按手势
UILongPressGestureRecognizer* gesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self
action:@selector(longPress:)];
// 为该控件添加手势处理器
[self.view addGestureRecognizer:gesture];
}
- (void)longPress:(UILongPressGestureRecognizer*)gesture
{
// 创建一个按钮
UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
//设置颜色
btn.backgroundColor = [UIColor grayColor];
// 获取NSArray中已经包含了几个按钮
NSInteger count = btnArr.count;
// 计算当前添加的按钮位于第几行、第几列
NSInteger row = count / 3;
NSInteger col = count % 3;
// 为该按钮设置文本
[btn setTitle:[NSString stringWithFormat:@"按钮%ld", (long)btnIndex]
forState:UIControlStateNormal];
// 设置该btn按钮的大小和位置
btn.frame = CGRectMake(MARGINE + col * CELL_WIDTH, row * CELL_HEIGHT + MARGINE , BUTTON_WIDTH , BUTTON_HEIGHT);
// 为该按钮添加事件处理方法
[btn addTarget:self
action:@selector(remove:)
forControlEvents:UIControlEventTouchUpInside];
// 将按钮添加到应用界面的UIView控件中
[self.view addSubview:btn];
//存入数组
[btnArr addObject:btn];
btnIndex ++;
}
- (void) remove:(id)sender
{
// 删除事件源控件(激发该事件的按钮)
[sender removeFromSuperview];
// 将触发该事件的按钮从NSMutableArray集合中删除
[btnArr removeObject:sender];
[self rearrange];
}
- (void) rearrange
{
// 重新计算每个按钮的大小和位置
for(int i = 0 ; i < btnArr.count; i ++)
{
NSInteger row = i / 3;
NSInteger col = i % 3;
UIButton* btn = [btnArr objectAtIndex:i];
btn.frame = CGRectMake(MARGINE + col * CELL_WIDTH, row * CELL_HEIGHT + MARGINE , BUTTON_WIDTH , BUTTON_HEIGHT);
}
}
@end