IOS基础-设计模式、手势识别器
target/action设计模式
每个视图点击事件都不一样,我们无法预先知道这个视图点击之后都要实现什么效果,因此我们在类内部提前写好点击事件不科学
使用target/action实现解耦
@implementation myView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"整个人都不好了");
//此时,不确定有那个对象实现action方法,
//也不确定执行什么方法,这样可以达到解耦的目的,即:实现触摸动作和触摸之后做什么操作完全分开
[self.target performSelector:self.action withObject:self afterDelay:0];
}
@end
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"整个人都不好了");
//此时,不确定有那个对象实现action方法,
//也不确定执行什么方法,这样可以达到解耦的目的,即:实现触摸动作和触摸之后做什么操作完全分开
[self.target performSelector:self.action withObject:self afterDelay:0];
}
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithRed:0 green:49/255.0 blue:79/255.0 alpha:1];
myView *view = [[myView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
view.backgroundColor = [UIColor colorWithRed:113/255.0 green:150/255.0 blue:159/255.0 alpha:1];
view.layer.cornerRadius = 8;
[self.view addSubview:view];
view.tag = 100;
//设置view的目标对象为控制器(self)
view.target =self;
//设置view要执行的方法(行为);
view.action = @selector(changeColor);
手势识别器
手势识别器是对触摸事件做了封装,我们无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用,我们把重心放在识别之后要做什么操作上
手势识别器是iOS中比较抽象的一个类,用于识别一个手势,即 有规律的触摸
#import "PhotoViewController.h"
#define kImageCount 6
@interface PhotoViewController ()
{
int _currentIndex;//当前图片索引
}
@end
@implementation PhotoViewController
- (void)dealloc{
[_imageView release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self initLayout];
[self addGesture];
}
#pragma mark 布局
- (void)initLayout{
/*添加图片展示控件*/
CGSize screenSize = [UIScreen mainScreen].applicationFrame.size;
CGFloat topPadding = 20;
CGFloat y = 22 + 44 +topPadding;
CGFloat height = screenSize.height - y - topPadding;
CGRect imageFrame = CGRectMake(0, y, screenSize.width, height);
_imageView = [[UIImageView alloc] initWithFrame:imageFrame];
_imageView.contentMode = UIViewContentModeScaleAspectFit;//设置内容模式为缩放填充
_imageView.userInteractionEnabled = YES;//这里必须设置为yes,否则无法接收手势操作
[self.view addSubview:_imageView];
//添加默认图片
UIImage *image = [UIImage imageNamed:@"0.png"];
_imageView.image = image;
[self showPhotoName];
}
#pragma mark 添加手势
- (void)addGesture{
/*1.添加点按手势*/
//创建手势对象
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapImage:)];
//设置手势属性
tapGesture.numberOfTapsRequired = 1;//设置点按次数,默认为1,注意在iOS中很少用到双击操作
tapGesture.numberOfTouchesRequired = 1;//点按的手指数
//添加手势到对象(注意,这里添加到控制器视图中,而不是图片上,否则点击空白无法隐藏导航栏)
[self.view addGestureRecognizer:tapGesture];
/*2.添加长按手势*/
//创建手势对象
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressGesture:)];
longPressGesture.minimumPressDuration = 0.5;//设置时长,默认0.5
//注意由于是长按图片操作,所以手势添加在图片,而不是视图控制器上
[_imageView addGestureRecognizer:longPressGesture];
/*3.添加捏合手势*/
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)];
[self.view addGestureRecognizer:pinchGesture];
/*4.添加旋转手势*/
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGesture:)];
[self.view addGestureRecognizer:rotationGesture];
/*5.添加拖动手势*/
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
[self.view addGestureRecognizer:panGesture];
// 6.添加清扫手势
UISwipeGestureRecognizer *swipeGestureToRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeGestureToRight.direction = UISwipeGestureRecognizerDirectionRight;//默认是向右轻扫
[self.view addGestureRecognizer:swipeGestureToRight];
UISwipeGestureRecognizer *swipeGestureToLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeGestureToLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeGestureToLeft];
// 解决在图片上滑动时拖动手势和轻扫手势的冲突
[panGesture requireGestureRecognizerToFail:swipeGestureToRight];
[panGesture requireGestureRecognizerToFail:swipeGestureToLeft];
//解决拖动和长按手势之间的冲突
[longPressGesture requireGestureRecognizerToFail:panGesture];
}
#pragma mark 显示图片名称
- (void)showPhotoName{
NSString *title = [NSString stringWithFormat:@"%i.png",_currentIndex];
[self setTitle:title];
}
#pragma mark 下一张图片
- (void)nextImage{
int index = (_currentIndex + kImageCount + 1) % kImageCount;
NSString *imageName = [NSString stringWithFormat:@"%i.png",index];
_imageView.image = [UIImage imageNamed:imageName];
_currentIndex = index;
[self showPhotoName];
}
#pragma mark 上一张图片
- (void)lastImage{
int index = (_currentIndex + kImageCount - 1) % kImageCount;
NSString *imageName = [NSString stringWithFormat:@"%i.png",index];
_imageView.image = [UIImage imageNamed:imageName];
[self showPhotoName];
}
#pragma mark - 手势操作
#pragma mark 点按隐藏或者显示导航栏
- (void)tapImage:(UITapGestureRecognizer *)gesture{
NSLog(@"点按隐藏或显示导航");
BOOL hidden = !self.navigationController.navigationBarHidden;
[self.navigationController setNavigationBarHidden:hidden animated:YES];
}
#pragma mark 长按显示是否删除
- (void)longPressGesture:(UILongPressGestureRecognizer *)gesture{
NSLog(@"长按删除");
//注意在手势里面有一个view属性可以获取点按的视图
// UIImageView *imageView = (UIImageView *)gesture.view;
if (gesture.state == UIGestureRecognizerStateBegan) {
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"系统提示" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"删除图片" otherButtonTitles: nil];
[actionSheet showInView:self.view];
}
}
#pragma mark 捏合时缩放图片
- (void)pinchGesture:(UIPinchGestureRecognizer *)gesture{
NSLog(@"捏合缩放图片");
if (gesture.state == UIGestureRecognizerStateChanged) {
//捏合手势scale属性记录的缩放比例
_imageView.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale);
}
else if(gesture.state == UIGestureRecognizerStateEnded){
[UIView animateWithDuration:.5 animations:^{
_imageView.transform = CGAffineTransformIdentity;//取消一切形变
}];
}
}
#pragma mark 旋转图片
- (void)rotationGesture:(UIRotationGestureRecognizer *)gesture{
NSLog(@"旋转跳跃");
if (gesture.state == UIGestureRecognizerStateChanged) {
//旋转手势中rotation属性记录了旋转弧度
_imageView.transform = CGAffineTransformMakeRotation(gesture.rotation) ;
}else if(gesture.state == UIGestureRecognizerStateEnded){
[UIView animateWithDuration:.8 animations:^{
_imageView.transform = CGAffineTransformIdentity;//取消形变
}];
}
}
#pragma mark 拖动图片
- (void)panGesture:(UIPanGestureRecognizer *)gesture{
NSLog(@"拖动图片");
if (gesture.state == UIGestureRecognizerStateChanged) {
CGPoint transLocation = [gesture translationInView:self.view];
_imageView.transform = CGAffineTransformMakeTranslation(transLocation.x, transLocation.y);
NSLog(@"transLoaction.x =%f ",transLocation.x);
}else if(gesture.state == UIGestureRecognizerStateEnded){
CGPoint transLocation = [gesture translationInView:self.view];
if (transLocation.x > 150) {
[self nextImage];
[UIView animateWithDuration:.5 animations:^{
_imageView.transform = CGAffineTransformIdentity;
}];
}else
[UIView animateWithDuration:.5 animations:^{
_imageView.transform = CGAffineTransformIdentity;
}];
if (transLocation.x < -150) {
[self lastImage];
[UIView animateWithDuration:.5 animations:^{
_imageView.transform = CGAffineTransformIdentity;
}];
}else
[UIView animateWithDuration:.5 animations:^{
_imageView.transform = CGAffineTransformIdentity;
}];
}
}
#pragma mark 轻扫查看上一张或下一张
- (void)swipeGesture:(UISwipeGestureRecognizer *)gesture{
//注意,轻扫是连续手势,但是只有在识别结束后才触发,不用判断状态
if (gesture.state == UIGestureRecognizerStateEnded) {
if (gesture.direction == UISwipeGestureRecognizerDirectionRight) {
[self nextImage];
NSLog(@"right");
}else if(gesture.direction == UISwipeGestureRecognizerDirectionLeft){
[self lastImage];
NSLog(@"left");
}
}
}
浙公网安备 33010602011771号