画面を拡大すると、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];
(…)//ここに他のいくつかの異なるもの
}
どうもありがとうございます。