国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

捏合與拖動手勢實現視圖的縮放拖動 以及 任一邊界拖進屏幕自動回彈

2019-11-07 23:58:38
字體:
來源:轉載
供稿:網友

實現這個功能也是被逼無奈,項目需要縮放移動有很多小頁簽的WKWebView,嘗試了UIScrollView,但是很不理想,因為webview需要側滑和上下滑動,所以縮放拖動絕大部分都無法觸發,只得采用手勢實現。在網上查閱了大量資料,終于實現了該功能,廢話不多說,上代碼:

1、定義縮放倍數和偏移量

// 縮放倍數#define minScale 1#define maxScale 2// 偏移量#define Offset 0

2、定義需要用到的屬性

@PRoperty (nonatomic,strong) UIImageView *imgView;// 要縮放的視圖// 縮放@property (nonatomic, assign) CGFloat lastScale;// 上一次縮放的比例@property (nonatomic, strong) UipinchGestureRecognizer *pinch;// 捏合手勢@property (nonatomic, strong) UIPanGestureRecognizer *pan;// 平移手勢

3、初始化視圖、手勢,并設置手勢

_imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"2.jpg"]]; _imgView.frame = self.view.frame; _imgView.userInteractionEnabled = YES; [self.view addSubview:_imgView]; _pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)]; _pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)]; [_imgView addGestureRecognizer:_pinch]; [_imgView addGestureRecognizer:_pan];

4、 設置錨點

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer{ //UIGestureRecognizerStateBegan意味著手勢已經被識別 if (gestureRecognizer.state ==UIGestureRecognizerStateBegan) { //手勢發生在哪個view上 UIView *piece = gestureRecognizer.view; //獲得當前手勢在view上的位置。 CGPoint locationInView = [gestureRecognizer locationInView:piece]; piece.layer.anchorPoint =CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height); //根據在view上的位置設置錨點。 //防止設置完錨點過后,view的位置發生變化,相當于把view的位置重新定位到原來的位置上。 CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; piece.center = locationInSuperview; }}

5、 縮放方法

- (void)pinchAction:(UIPinchGestureRecognizer *)gestureRecognizer{ UIGestureRecognizerState state = [gestureRecognizer state]; if(state == UIGestureRecognizerStateBegan) { _lastScale = [gestureRecognizer scale]; } if (gestureRecognizer.scale > 1) { [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; }else{ _imgView.layer.anchorPoint =CGPointMake(0.5, 0.5); _imgView.center = self.view.center; } CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue]; if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged) { CGFloat newScale = 1 - (_lastScale - [gestureRecognizer scale]); newScale = MIN(newScale, maxScale / currentScale); newScale = MAX(newScale, minScale / currentScale); CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale); NSLog(@"newScale = %f,currentScale = %f",newScale,currentScale); [gestureRecognizer view].transform = transform; _lastScale = [gestureRecognizer scale]; } if (state == UIGestureRecognizerStateEnded) { if (currentScale >= minScale && currentScale <= minScale + 0.1) { [_imgView removeGestureRecognizer:_pan]; }else if(currentScale > minScale + 0.1 && currentScale <= maxScale){ [_imgView addGestureRecognizer:_pan]; } }}

6、 拖動方法

- (void)panAction:(UIPanGestureRecognizer *)gestureRecognizer{ if (gestureRecognizer.state == UIGestureRecognizerStateBegan || gestureRecognizer.state == UIGestureRecognizerStateChanged) { if (!(_imgView.frame.origin.x == 0 && _imgView.frame.origin.y == 0 && _imgView.frame.size.width == self.view.frame.size.width && _imgView.frame.size.height == self.view.frame.size.height)) { CGPoint translation = [gestureRecognizer translationInView:self.view]; gestureRecognizer.view.center = CGPointMake(gestureRecognizer.view.center.x + translation.x, gestureRecognizer.view.center.y + translation.y); [gestureRecognizer setTranslation:CGPointZero inView:self.view]; } } CGRect rect = _imgView.frame; if (_imgView.frame.origin.x > 0 + Offset) {//左邊進入屏幕 NSLog(@"左邊進入屏幕"); [UIView animateWithDuration:0.25 animations:^{ CGPoint point = CGPointMake(gestureRecognizer.view.center.x - gestureRecognizer.view.frame.origin.x, gestureRecognizer.view.center.y); gestureRecognizer.view.center = point; }]; }else if (CGRectGetMaxX(rect) < self.view.frame.size.width + Offset){ NSLog(@"右邊進入屏幕"); [UIView animateWithDuration:0.25 animations:^{ CGRect newRect = CGRectOffset(_imgView.frame, self.view.frame.size.width - CGRectGetMaxX(_imgView.frame), 0); _imgView.frame = newRect; }]; } if (_imgView.frame.origin.y > 0 + Offset) {//上邊進入屏幕 NSLog(@"上邊進入屏幕"); [UIView animateWithDuration:0.25 animations:^{ CGPoint point = CGPointMake(gestureRecognizer.view.center.x, gestureRecognizer.view.center.y - gestureRecognizer.view.frame.origin.y); gestureRecognizer.view.center = point; }]; }else if(CGRectGetMaxY(rect) < self.view.frame.size.height + Offset){ NSLog(@"下邊進入屏幕"); [UIView animateWithDuration:0.25 animations:^{ CGRect newRect = CGRectOffset(_imgView.frame, 0, self.view.frame.size.height - CGRectGetMaxY(_imgView.frame)); _imgView.frame = newRect; }]; }}

手勢實現也是萬不得已才用的,如果有哪位大神解決了UIScrollView縮放有多個側滑頁簽,并且可以上下滑動的WKWebView,請給我留言,相互交流,萬分感謝。

轉載請注明出處,萬分感謝!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文化| 女性| 乌鲁木齐市| 吉水县| 益阳市| 三门峡市| 普安县| 巩留县| 顺平县| 孟津县| 双牌县| 纳雍县| 仁寿县| 德阳市| 开封市| 东丰县| 泊头市| 托里县| 宝应县| 两当县| 六安市| 萨迦县| 弋阳县| 延川县| 甘泉县| 垫江县| 金湖县| 永新县| 新乐市| 枣庄市| 华容县| 长垣县| 江西省| 通州市| 聂拉木县| 文水县| 蓝山县| 许昌市| 井研县| 贡觉县| 介休市|