画面を拡大すると、uipangesturerecognizerに問題があります。
私のアプリには、uiviewを備えたuiviewcontrollerがあります。
このビューでは、画面境界全体のほぼ半分であるキャレイヤーがあります。
このcalayerには、ユーザーがドラッグ(uipangesture)、追加(uitapgesture)、および削除(doubletapgesture)できるいくつかのサブレイヤーがあります。より正確にドラッグするために、uiviewにuipinchgestureメソッドを追加してズームインおよびズームアウトしました。
この時点で、ズームインしてサブレイヤーを移動(パンジェスチャ)しようとした場合を除いて、すべてが正常に機能します。動作する場合もありますが、通常は動作しません(ズームインしないと常に正常に動作します)。
コードに何か問題があるのか、それともこれがその方法ではないのかわかりません。私が見逃しているものはありますか?
私はSDK4.2の下にいます。
これらは私のコードです:
-(id)initWithFrame:(CGRect)frame {{ [スーパーinitWithFrame:frame]; (…) perfil = [[CALayer alloc] init]; //uiviewのcalayer [perfil setBounds:CGRectMake(0、0、wide、heigth / 2)]; [[自己層]addSublayer:perfil]; //ユーザーが「編集ボタン」に触れたときにサブレイヤーを「危険」レイヤーに追加します。これは正常に機能します // UIGsture Recognizers UITapGestureRecognizer * singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapFrom :)]; UITapGestureRecognizer * doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTapFrom :)]; UIPinchGestureRecognizer * pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchFrom :)]; UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom :)]; [panGestureRecognizer setMinimumNumberOfTouches:1]; [panGestureRecognizer setMaximumNumberOfTouches:1]; [singleTapRecognizer setNumberOfTapsRequired:1]; [singleTapRecognizer setCancelsTouchesInView:NO]; [doubleTapRecognizer setNumberOfTapsRequired:2]; [自己addGestureRecognizer:singleTapRecognizer]; [自己addGestureRecognizer:doubleTapRecognizer]; [自己addGestureRecognizer:pinchGestureRecognizer]; [自己addGestureRecognizer:panGestureRecognizer]; [singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer]; singleTapRecognizer.delegate = self; doubleTapRecognizer.delegate = self; pinchGestureRecognizer.delegate = self; panGestureRecognizer.delegate = self; //ここにいくつかの他の異なるもの }
-(void)handlePanFrom:(id)sender {{ CGPointポイント=[(UIPanGestureRecognizer *)sender locationInView:self]; boxLayer = [[self perfil] hitTest:point]; [自己becomeFirstResponder]; if([(UIPanGestureRecognizer *)sender state] == UIGestureRecognizerStateBegan) {{ numberOfSublayer = 1000; //UIView.hでintとして宣言されています for(CALayer * [perfil sublayers]の要素) {{ if([boxLayer isEqual:elements]) {{ numberOfSublayer = [[perfil sublayers] indexOfObject:elements]; 壊す; } } } (…)//サブレイヤーを見つけたらさらにいくつかの操作 }
-(void)handlePinchFrom:(id)sender {{ if([(UIPinchGestureRecognizer *)sender state] == UIGestureRecognizerStateEnded) {{ lastScale = 1.0; 戻る; } if([(UIPinchGestureRecognizer *)sender state] == UIGestureRecognizerStateBegan || [(UIPinchGestureRecognizer *)送信者の状態] == UIGestureRecognizerStateChanged){ CGFloat currentScale = [[[sender view] .layer valueForKeyPath:@ "transform.scale"] floatValue]; const CGFloat kMaxScale = 4.0; const CGFloat kMinScale = 1.0; CGFloat newScale = 1-(lastScale-[(UIPinchGestureRecognizer *)sender scale]); newScale = MIN(newScale、kMaxScale / currentScale); newScale = MAX(newScale、kMinScale / currentScale); CGAffineTransform transform = CGAffineTransformScale([[sender view] transform]、newScale、newScale); [送信者ビュー].transform=変換; if([perfil sublayers]) {{ for(CALayer * [perfil sublayers]の要素)//ここでは、サブレイヤーへのズームを調整しようとしています {{ //これが最初のアプローチの1つです // CGAffineTransform transformELS = CGAffineTransformScale([elements affineTransform]、7 /(newScale + 6)、7 /(newScale + 6)); // [elements setAffineTransform:transformELS]; //これが2番目のアプローチです [elements setBounds:CGRectMake(0、0、elements.bounds.size.width * 7 /(newScale + 6)、elements.bounds.size.height * 7 /(newScale + 6))]; } } lastScale = [(UIPinchGestureRecognizer *)sender scale]; (…)//ここに他のいくつかの異なるもの }
どうもありがとうございます。