最近遇到一个问题,用Masonry写的布局;
拖动其中某个view,拖动方法按传统的写成如下形式。如果view中的label更改text值,拖动之后的view就会回到最初被设定的位置。
- (void)objectDidDragged:(UIPanGestureRecognizer *)paramSender { if (paramSender.state != UIGestureRecognizerStateEnded && paramSender.state != UIGestureRecognizerStateFailed){ //通过使用 locationInView 这个方法,来获取到手势的坐标 CGPoint location = [paramSender locationInView:paramSender.view.superview]; paramSender.view.center = location; } }
经试验后,拖动方法需改为如下所示:
// // ViewController.m // PanGesTest // // Created by Vivien on 16/9/18. // Copyright © 2016年 Vivien. All rights reserved. // #import "Masonry.h" #import "ViewController.h" @interface ViewController () { NSTimer *timer ; int count; CGPoint panPoint; } @property (strong, nonatomic) UIView *panView; @property (strong, nonatomic) UILabel *countLabel; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _panView = [[UIView alloc]init]; _panView.backgroundColor = [UIColor grayColor]; [self.view addSubview:_panView]; UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(objectDidDragged:)]; //限定操作的触点数 [panGR setMaximumNumberOfTouches:1]; [panGR setMinimumNumberOfTouches:1]; //将手势添加到draggableObj里 [_panView addGestureRecognizer:panGR]; [_panView mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.view).offset(10); make.left.mas_equalTo(self.view).offset(30); make.width.mas_equalTo(150); make.height.mas_equalTo(50); }]; _countLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 20)]; [_countLabel setText:@"00000"]; [_countLabel setTextColor:[UIColor redColor]]; [_countLabel setTextAlignment:NSTextAlignmentCenter]; [_countLabel setFont:[UIFont systemFontOfSize:13]]; [_panView addSubview:_countLabel]; [_countLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.top.mas_equalTo(_panView); make.height.mas_equalTo(20); }]; timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countAdd) userInfo:nil repeats:YES]; [timer fire]; count = 0; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)objectDidDragged:(UIPanGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { panPoint = [sender locationInView:_panView]; NSLog(@"panPoint:%@",NSStringFromCGPoint(panPoint)); } if (sender.state != UIGestureRecognizerStateEnded && sender.state != UIGestureRecognizerStateFailed) { CGPoint inViewLoction = [sender locationInView:self.view];//sender.view.superview CGPoint location = [sender translationInView:sender.view.superview]; NSLog(@"locationInView:%@,translationInView:%@",NSStringFromCGPoint(inViewLoction),NSStringFromCGPoint(location)); // sender.view.center = inViewLoction; [_panView mas_remakeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(150); make.height.mas_equalTo(50); make.left.mas_equalTo(inViewLoction.x-panPoint.x); make.top.mas_equalTo(inViewLoction.y-panPoint.y); // make.left.mas_equalTo(0).offset(inViewLoction.x-panPoint.x); // make.top.mas_equalTo(0).offset(inViewLoction.y-panPoint.y); }]; NSLog(@"className:%@",NSStringFromClass([sender.view.superview class])); [sender setTranslation:CGPointZero inView:self.view]; } } - (void)countAdd { count ++; [_countLabel setText:[NSString stringWithFormat:@"%d",count]]; } @end