0

サブビューとしていくつかのボタンを持つカスタム UIView があります。touchesBegan/Moved/Ended を使用して、ユーザーの指でビューを回転させています。問題は、ボタンからビューをドラッグ/回転しようとすると、touchesメソッドが呼び出されないことです。イベントに応答するにはボタンが必要ですがUIControlEventTouchUpInside、ビューでドラッグすると、ビューが回転します。私はこの質問とこの質問を見てきましたが、どちらの解決策もうまくいきませんでした。

これが私のカスタムビューコードです:

- (id)initWithFrame:(CGRect)frame andRadius:(float)Radius andViews:

(NSMutableArray *)AllViews
{
    self = [super initWithFrame:frame];
    if (self) {
        radius = Radius;
        allViews = AllViews;

        for(int i = 0; i < [allViews count]; i++){
            //the "currentView" is a UIButton
            UIView *currentView = (UIView *)[allViews objectAtIndex:i];
            [currentView setFrame:CGRectMake(frame.size.width / 2 - 25 + radius * cos((2 * M_PI / [allViews count]) * i), frame.size.height / 2 - 25 + radius * sin((2 * M_PI / [allViews count]) * i), 50, 50)];
            [self addSubview:currentView];

        }
        [self setBackgroundColor:[UIColor redColor]];
        [self setAlpha:.5];

    }
    return self;
}

//- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
//{
//    for (UIView * view in [self subviews]) {
//        if ([view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
//            return YES;
//        }
//    }
//    return NO;
//}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];

    x = point.x;
    y = point.y;

    NSLog(@"touchesBegan");
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];

    float X = point.x;
    float Y = point.y;

    float a = sqrt(X * X + Y * Y);
    float b = sqrt(x * x + y * y);
    float c = sqrt((x - X) * (x - X) + (y - Y) * (y - Y));

    float alpha = acos((a * a + b * b - (c * c)) / (2 * a * b));
    if(alpha == NAN)
        alpha = 0;

    alpha = -alpha;


    [UIView beginAnimations:@"rotate" context:nil];
    [UIView setAnimationDuration:0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    self.transform = CGAffineTransformRotate(self.transform, alpha);
    [UIView commitAnimations];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];

    float X = point.x;
    float Y = point.y;

    float a = sqrt(X * X + Y * Y);
    float b = sqrt(x * x + y * y);
    float c = sqrt((x - X) * (x - X) + (y - Y) * (y - Y));

    float alpha = acos((a * a + b * b - (c * c)) / (2 * a * b));

    alpha = -alpha;


    [UIView beginAnimations:@"rotate" context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    self.transform = CGAffineTransformRotate(self.transform, alpha);
    [UIView commitAnimations];
    NSLog(@"touchesEnded");
}

- (void)dealloc
{
    [allViews release];
    [super dealloc];
}

助言がありますか?

4

2 に答える 2

0

あなたが探している答えではないかもしれませんが、

「ボタンを指で押し下げてからボタンの外側に指をドラッグする」アクティビティを、ボタンの後ろのビューでドラッグ/回転モーションとしてピックアップする理由がわかりません。私が知る限り、ボタンの内側に指を置いた場合、背後のビューではなく、ボタンを操作していることになります。また、画面に触れたまま指をボタンから離すと、ボタンの押下を中止することになります (つまり、ボタンを「武装」させましたが、「トリガー」はしていません)、背後のビューと対話するためではありません。

だから私が言いたいのは、なぜあなたはこれをしたいのですか?UIデザインを再考する必要があるかもしれません。

絶対にこれを行いたい場合は、などUIGestureRecognizerの代わりに sを使用することを検討することをお勧めtouchesBeganします。これらを使用すると、より複雑なシナリオをより簡単に設定できます。ただし、ジェスチャ レコグナイザーは、iOS のすべてのバージョンで使用できるわけではありません。

または、ボタンのように見えるものや必要なものを実装し、touchesBegan などを使用してタッチ (およびビューのドラッグなど) を処理します。つまり、実際のボタンを使用しないでください。

于 2012-05-15T21:25:14.223 に答える
0

誰かが同様の問題に遭遇した場合に備えて、私が使用した解決策を投稿します. ボタンとして使用した別のUIViewクラスをオーバーライドしました。それぞれの でtouchedBegan/Moved/Ended、ボタン クリックに必要なコードを実装し、次のUIViewように、コマンド チェーンのタッチアップを次の custom に渡しました。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];

    if (point.x < self.frame.size.width && point.y < self.frame.size.height) {
        NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSString stringWithFormat:@"%d", self.tag], @"tag", nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeFilter" object:self userInfo:userInfo];
    }


    [self.nextResponder touchesEnded:touches withEvent:event];
}

NSNotifications を使用しViewControllerて、オーバーライドされたビューを含む my にアクションを送信していることに注意してください。

于 2012-05-22T13:42:59.940 に答える