iOS 手勢(shì)
1.如果一個(gè)控件繼承于 UIControl巍实,那么它將不需要手勢(shì)
2.所有控件都可以添加手勢(shì)
[控件 addGestureRecognizer: ]
3.iOS 系統(tǒng)提供的手勢(shì)有哪些
UITapGestureRecognizer 點(diǎn)擊
UISwipeGestureRecognizer 輕掃
UIPanGestureRecognizer 拖動(dòng)
UIRotationGestureRecognizer 旋轉(zhuǎn)
UIPinchGestureRecognizer 捏合
UILongPressGestureRecognizer 長(zhǎng)按
4.iOS 自定義的手勢(shì)都是具有相同的父類 UIGestureRecognizer
5.UIGestureRecognizer 這個(gè)手勢(shì)父類是如何封裝滓技?
UIGestureRecognizer 這個(gè)父類可以看做一個(gè)抽象類,并不具備手勢(shì)的具體功能棚潦,但是它提供了子類共有的初始化方法令漂、屬性孽亲、代理
<共有的初始化方法>
- (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action
<2>手勢(shì)的狀態(tài) state
<3>手勢(shì)是否有效 enable
<4>代理 delegate
<5>被添加手勢(shì)的 view
/** 圖片 */
@property (nonatomic,strong) UIImageView *imageView;
/** 數(shù)組 */
@property (nonatomic,strong) NSArray *images;
/** 圖片張數(shù) */
@property int count;
_count = 0;
_images = @[[UIImage imageNamed:@"00"],[UIImage imageNamed:@"01"],[UIImage imageNamed:@"02"]];
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width / 2 - 50, [UIScreen mainScreen].bounds.size.height / 2 -100, 100, 200)];
_imageView.image = _images[_count];
_imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:_imageView];
//手勢(shì)需要開(kāi)啟用戶交互
_imageView.userInteractionEnabled = YES;
點(diǎn)擊手勢(shì)
//單擊手勢(shì)
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
[_imageView addGestureRecognizer:singleTap];
- 雙擊手勢(shì) 添加 numberOfTapsRequired屬性 能判斷點(diǎn)擊次數(shù)
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapAction:)];
//判斷點(diǎn)擊次數(shù)
doubleTap.numberOfTapsRequired = 2;
[singleTap requireGestureRecognizerToFail:doubleTap];
[_imageView addGestureRecognizer:doubleTap];
UITapGestureRecognizer *threeTop = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(TapGestureAction:)];
threeTop.numberOfTapsRequired = 3;
[doubleTap requireGestureRecognizerToFail:threeTop];
[_imageView addGestureRecognizer:threeTop];
-(void)TapGestureAction:(UITapGestureRecognizer *)sender
{
if (sender.numberOfTapsRequired == 1) {
NSLog(@"單擊");
}
else if (sender.numberOfTapsRequired == 2) {
NSLog(@"雙擊");
}
else
{
NSLog(@"三擊");
}
}
輕掃手勢(shì)
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];
leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //左
[_imageView addGestureRecognizer:leftSwipe];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_imageView addGestureRecognizer:rightSwipe];
-(void)swipeAction:(UISwipeGestureRecognizer *)sender
{
switch (sender.direction) {
case UISwipeGestureRecognizerDirectionLeft:
{
NSLog(@"向左輕掃");
if (_count > _images.count - 2) {
//掃到最右一張彈出警示框
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"最后一張" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:sure];
[self presentViewController:alertController animated:YES completion:nil];
break;
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0f];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_imageView cache:YES];
[UIView commitAnimations];
_imageView.image = _images[++_count];
}
break;
case UISwipeGestureRecognizerDirectionRight:
{
NSLog(@"向右輕掃");
if (_count < _images.count - 2) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"第一張" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:sure];
[self presentViewController:alertController animated:YES completion:nil];
break;
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0f];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_imageView cache:YES];
[UIView commitAnimations];
_imageView.image = _images[--_count];
}
default:
break;
}
}
拖動(dòng)手勢(shì)
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureAction:)];
[_imageView addGestureRecognizer:panGesture];
-(void)panGestureAction:(UIPanGestureRecognizer *)sender
{
NSLog(@"拖動(dòng)");
//轉(zhuǎn)換坐標(biāo)系
CGPoint point = [sender translationInView:self.view];
_imageView.center = CGPointMake(_imageView.center.x + point.x, _imageView.center.y + point.y);
[sender setTranslation:CGPointZero inView:self.view];
}
旋轉(zhuǎn)手勢(shì)
UIRotationGestureRecognizer *rotationGestur = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
[_imageView addGestureRecognizer:rotationGestur];
-(void)rotationAction:(UIRotationGestureRecognizer *)sender
{
NSLog(@"旋轉(zhuǎn)");
_imageView.transform = CGAffineTransformMakeRotation(sender.rotation);
}
捏合手勢(shì)
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureAction:)];
[_imageView addGestureRecognizer:pinchGesture];
-(void)pinchGestureAction:(UIPinchGestureRecognizer *)sender
{
NSLog(@"捏合");
_imageView.transform = CGAffineTransformMakeScale(sender.scale,sender.scale);
}
長(zhǎng)按事件
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
[_imageView addGestureRecognizer:longPress];
-(void)longPressAction:(UILongPressGestureRecognizer *)sender
{
NSLog(@"長(zhǎng)按");
if (sender.state == UIGestureRecognizerStateBegan) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *cancle = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:cancle];
UIAlertAction *savePhoto = [UIAlertAction actionWithTitle:@"保存到相冊(cè)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UIImageWriteToSavedPhotosAlbum(_imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}];
[alertController addAction:savePhoto];
UIAlertAction *openPhoto = [UIAlertAction actionWithTitle:@"打開(kāi)相冊(cè)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
//資源類型為打開(kāi)相冊(cè)
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
//選擇后的圖片可以被編輯
picker.allowsEditing = YES;
[self presentViewController:picker animated:YES completion:nil];
}];
[alertController addAction:openPhoto];
UIAlertAction *turnonCamer = [UIAlertAction actionWithTitle:@"打開(kāi)相機(jī)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.delegate = self;
picker.allowsEditing = YES;
[self presentViewController:picker animated:YES completion:nil];
}];
[alertController addAction:turnonCamer];
[self presentViewController:alertController animated:YES completion:^{
}];
}
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSString *msg = nil;
if (!error) {
msg = @"保存成功";
}
else
{
msg = @"圖片保存失敗";
}
NSLog(@"%@",msg);
}
- 打開(kāi)相冊(cè)和打開(kāi)相機(jī)的事件方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
//打開(kāi)相機(jī)
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
_imageView.image = info[@"UIImagePickerControllerEditedImage"];
}
//打開(kāi)相冊(cè)
else
{
NSLog(@"info = %@",info);
//獲取永華編輯之后的圖片
_imageView.image = info[@"UIImagePickerControllerEditedImage"];
}
[self dismissViewControllerAnimated:YES completion:nil];
}