0

カスタムスイッチがあります

UICustomSwtich:UISlider

ここからダウンロード

使い方

UICustomSwitch動作する必要があるため、このタッチ イベントを上書きして動作させます。

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

良いテスト

UICustomSwitchUIViewでさえも完全に機能しますUIScrollView。3 つのタッチ イベントは、呼び出す必要があるときに適切に呼び出されます。

悪い作品

これが私の問題です。UITableViewこの階層を持つ StoryBoard から設計されたスタティックがあります。

UITableView> UITableViewCell> UIView>UICustomSwitch

このシナリオでは:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

この関数は適切に呼び出されます

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event

親指をバーの長さよりも短く動かすと、親指はそのままの位置に残ります (問題)。

親指を左右に動かす (バーの端を上げる) と、2 つのメソッドが呼び出されます (非常に奇妙な動作ですね)。

さまざまな解決策で同様の問題を見つける答えを探しましたが、私の問題には適しています。

タッチイベントが届くときUICustomSwitchと届かないときがあるのはなぜですか? そして、ended と trackingWithTouch のイベントがあるのに、begined ではないのはなぜですか?

前もって感謝します。

4

1 に答える 1

0

すべての(コメントが少ない)タッチおよびトラックイベントを実装するソリューションを取得しました:

#pragma - touches

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesBegan:touches withEvent:event];

    LOG(@"touches began");

    m_touchedSelf = NO;
    on = !on;
}

//- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    [super touchesMoved:touches withEvent:event];
//    
//    LOG(@"touches moved");
//    
//}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesEnded:touches withEvent:event];

    LOG(@"touches ended");

    if (!m_touchedSelf)
    {
        [self setOn:on animated:YES];
        [self sendActionsForControlEvents:UIControlEventValueChanged];
    }
}


- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];

    LOG(@"touches cancelled");

    CGPoint location = [[touches anyObject] locationInView:self];
    if (location.x > self.frame.size.width/2) {
        [self setOn:YES animated:YES];
    }else{
        [self setOn:NO animated:YES];
    }

}

#pragma - trackings

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{

    [super endTrackingWithTouch:touch withEvent:event];

    LOG(@"endTrackingWithTouch");

    m_touchedSelf = YES;

    if (self.value > 0.5) {
        [self setOn:YES animated:YES];
    }else{
        [self setOn:NO animated:YES];
    }
}

- (void) cancelTrackingWithEvent:(UIEvent *)event
{

    LOG(@"cancelTrackingWithEvent");

    m_touchedSelf = YES;

    if (self.value > 0.5) {
        [self setOn:YES animated:YES];
    }else{
        [self setOn:NO animated:YES];
    }
}

コントロールがテーブルの外にある場合は、通常の方法で動作します。がテーブル内にある場合、キャンセルされたメソッドによって終了することもあれば、終了したメソッドによって終了することもあります。いずれにせよ、正しい動作が得られました。

しかし、未解決の問題があります.. なぜUITableView、またはのイベントをUITableViewCellキャンセルしますか?UITouchUICustomSwitch

于 2013-01-18T08:53:03.453 に答える