UIPanGestureRecognizer實現(xiàn)左右滑動
1.添加手勢和觀察者
// 添加pan手勢
[self.view addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]];
// 添加觀察者監(jiān)聽oneView的frame的改變
[self.oneView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionOld context:nil];
2.監(jiān)聽手勢和觀察者
// 監(jiān)聽觀察者
(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (self.oneView.frame.origin.x > 0) {
self.threeView.hidden = YES;
}else if (self.oneView.frame.origin.x < 0)
{
self.threeView.hidden = NO;
}
}(void)dealloc
{
NSLog(@"移除");
[self.oneView removeObserver:self forKeyPath:@"frame"];
}
// 監(jiān)聽手勢-
(void)pan:(UIPanGestureRecognizer *)pan
{
// 獲取手勢移動的位置 self.view:規(guī)定區(qū)域
CGPoint point = [pan translationInView:self.view];
// 獲取位置水平的偏移量
CGFloat offsetX = point.x;
// 改變oneView的frame
self.oneView.frame = [self frameWithOffsetX:offsetX];// 復(fù)位 否則pan的偏移量會遞增
[pan setTranslation:CGPointZero inView:self.view];
// 判斷拖動結(jié)束的時候
if (pan.state == UIGestureRecognizerStateEnded) {
CGFloat target = 0;
if (self.oneView.frame.origin.x > [UIScreen mainScreen].bounds.size.width * 0.5) {
target = self.view.bounds.size.width * 0.2;
}
// 獲取x偏移量
CGFloat constant = self.view.bounds.size.width - target;
// 便宜
self.oneView.frame = target == 0 ? self.view.bounds : CGRectMake(constant, 0, self.view.bounds.size.width, self.view.bounds.size.height);
}
}