iOS学习笔记之-使用UITouch来根据手指位置移动图片

//

//  ViewController.m

//  UITouchStudy

//

//  Created by LiuJunHong on 17/3/9.

//  Copyright © 2017 liujunhong. All rights reserved.

//


#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    UIImage*image = [UIImage imageNamed:@"IMG_2117.png"];

    UIImageView*imageview = [[UIImageView alloc]init];

    imageview.image = image;

    imageview.frame = CGRectMake(50, 100, 200, 300);

    [self.view addSubview:imageview];

    imageview.tag=100;

}

//点击屏幕的瞬间,手指刚刚碰到屏幕

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    NSLog(@"手指触碰到的瞬间");

    UITouch*touch = [touches anyObject];

    //获得当前的点击的位置

    _last = [touch locationInView:self.view ];

    //获得点击对象,单次点击只有一个对象

//    UITouch*touch = [touches anyObject];

//

//    if(touch.tapCount==1){

//    

//        NSLog(@"1");

//    

//    }else if(touch.tapCount==2){

//    

//        NSLog(@"2");

//    }

}

//手指没离开屏幕,手指在屏幕上的时候调用,可以获得手指移动时候的数据

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch*touch =[touches anyObject];

    //手指相对于当前视图的坐标

    CGPoint pt = [touch locationInView:self.view];

    //计算拖动后x方向的偏移

    float xOffset=pt.x-_last.x;

    //计算拖动后y方向的偏移

    float yOffset=pt.y-_last.y;

    NSLog(@"%f,%f",pt.x,pt.y);

    //获得图片的视图

    UIImageView * imageview  =(UIImageView*)[self.view viewWithTag:100];

    //移动的时候将手指的最后位置设置为当前手指的位置,要是不设置,偏移量始终是根据某一个位置计算,跟手指的位置就没有关系了

    _last=pt;

    //当前的imageviewxy加上偏移量,就是实际移动的位置,而不是一直手指在左上角

    imageview.frame = CGRectMake(imageview.frame.origin.x+xOffset ,imageview.frame.origin.y+yOffset, imageview.frame.size.width, imageview.frame.size.height);

    

    NSLog(@"手指移动");

}

//手指离开屏幕

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    NSLog(@"手指离开屏幕");

    //获得点击对象,单次点击只有一个对象

//    UITouch*touch = [touches anyObject];

//    

//    if(touch.tapCount==1){

//        

//        NSLog(@"1");

//        

//    }else if(touch.tapCount==2){

//        

//        NSLog(@"2");

//    }


}

//特殊情况,中断现在的触屏事件,比如玩游戏来电话了

-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    NSLog(@"取消点击事件");


}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



@end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个手势解锁的Demo,你可以参考一下: ``` import UIKit class GestureLockViewController: UIViewController { // MARK: - Properties var buttons = [UIButton]() var selectedButtons = [UIButton]() var lines = [CAShapeLayer]() var touchPoint: CGPoint? var isTouching = false // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white let margin: CGFloat = 40 let distance: CGFloat = 80 let buttonWidth: CGFloat = 60 let buttonHeight: CGFloat = 60 let viewWidth = view.bounds.width let viewHeight = view.bounds.height for i in 0..<9 { let row = CGFloat(i / 3) let col = CGFloat(i % 3) let x = margin + col * (buttonWidth + distance) let y = margin + row * (buttonHeight + distance) let button = UIButton(frame: CGRect(x: x, y: y, width: buttonWidth, height: buttonHeight)) button.layer.cornerRadius = buttonWidth / 2 button.layer.borderWidth = 2 button.layer.borderColor = UIColor.lightGray.cgColor button.tag = i view.addSubview(button) buttons.append(button) } } // MARK: - Gesture Methods override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } let point = touch.location(in: view) for button in buttons { if button.frame.contains(point) && !selectedButtons.contains(button) { touchPoint = button.center selectedButtons.append(button) isTouching = true break } } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard isTouching, let touch = touches.first else { return } let point = touch.location(in: view) touchPoint = point for button in buttons { if button.frame.contains(point) && !selectedButtons.contains(button) { button.isSelected = true selectedButtons.append(button) let line = CAShapeLayer() line.strokeColor = UIColor.gray.cgColor line.fillColor = UIColor.clear.cgColor line.lineWidth = 3 view.layer.addSublayer(line) lines.append(line) break } } drawLines() } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { isTouching = false touchPoint = nil for button in buttons { button.isSelected = false } validatePassword() clearSelectedButtons() clearLines() } override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { isTouching = false touchPoint = nil for button in buttons { button.isSelected = false } clearSelectedButtons() clearLines() } // MARK: - Private Methods private func drawLines() { guard let point = touchPoint else { return } let linePath = UIBezierPath() linePath.move(to: point) for button in selectedButtons { linePath.addLine(to: button.center) } if let lastButton = selectedButtons.last, isTouching { linePath.addLine(to: lastButton.convert(lastButton.center, to: view)) } lines.last?.path = linePath.cgPath } private func clearSelectedButtons() { for button in selectedButtons { button.isSelected = false } selectedButtons.removeAll() } private func clearLines() { for line in lines { line.removeFromSuperlayer() } lines.removeAll() } private func validatePassword() { let password = selectedButtons.map { "\($0.tag)" }.joined() print("Gesture password: \(password)") } } ``` 这个Demo实现了一个3x3的手势解锁界面,使用了`UIButton`和`CAShapeLayer`来实现。当用户滑动手指时,会根据手指位置,自动连接之前选中的按钮,形成一条线。当用户抬起手指时,会根据选中的按钮的顺序,输出一个密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值