1

UISlider「スライドしてロックを解除する」スライダーのような作品を作りました。私がする必要があるのは、指を離すことがとして分類されるポイントを決定することtouchUpOUTSIDEですtouchUpINSIDE。これは、スライダーの端を超えて指をスライドさせすぎるポイントです。と同じだと思いUIButtonます。ボタンを押してから指をボタンから離すと、どこまで進んでも、として分類できますtouchUpInside。可能であれば、ターゲット領域を円でマークしたいと思います。

このポイントがどこにあるかを見つけたら、それを変更することはできますか?だから私はより大きなターゲットエリアを持つことができますか?

どこから始めたらいいのかわからない。ありがとう

4

2 に答える 2

0

ドキュメントによると、UIControlEventTouchUpOutsideイベントは指がコントロールの境界の外にあるときにトリガーされます。その領域を変更しようとしている場合は、スライダーがそれに合わせて拡大縮小します。UIControlEventTouchUpOutsideのアクションをと同じに結び付けてみませんUIControlEventTouchUpInsideか?

于 2012-06-05T15:12:35.523 に答える
0

数時間かかりましたが、なんとか並べ替えることができました。touchesMoved、touchesEnded、sendAction:action:target:eventをオーバーライドして多くのテストを行いましたが、フレームクラスの70px以内のタッチはすべてINSIDEのタッチのようです。したがって、292x52のUISliderの場合、x:-70からx:362またはy:-70から122までのタッチは、フレームの外側であっても、内側のタッチとしてカウントされます。

カスタムクラスをオーバーライドして、フレームの周囲100pxのより大きな領域を内側のタッチとしてカウントできるようにする、このコードを思いつきました。

#import "UICustomSlider.h"

@implementation UICustomSlider {
    BOOL callTouchInside;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    callTouchInside = NO;
    [super touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x > -100 && touchLocation.x < self.bounds.size.width +100 && touchLocation.y > -100 && touchLocation.y < self.bounds.size.height +100) callTouchInside = YES;

    [super touchesEnded:touches withEvent:event];
}

-(void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
    if (action == @selector(sliderTouchOutside)) {                          // This is the selector used for UIControlEventTouchUpOutside
        if (callTouchInside == YES) {
            NSLog(@"Overriding an outside touch to be an inside touch");
            [self sendAction:@selector(UnLockIt) to:target forEvent:event]; // This is the selector used for UIControlEventTouchUpInside
        } else {
            [super sendAction:action to:target forEvent:event];
        }
    } else {
        [super sendAction:action to:target forEvent:event];
    }
}

もう少し調整すれば、逆の場合にも使用できるはずです。(外側のタッチとしてより近いタッチを使用)。

于 2012-06-05T21:17:16.657 に答える