1

UIView があり、その上に UIButton、UITableView、および UINavigationBar があります。私がやりたいことは、UIButton をクリックしてドラッグすると、画面が終了するまで、すべてのビューが左側にのみ移動することです。つまり、ビューを左にドラッグでき、タッチを止めると、指が画面に触れなくなったところでビューが停止します。

私にはできません。彼は「Touches Began 1」だけを見せてくれました。ここで私の問題は何ですか?

みんなありがとう!

float oldX, oldY;
BOOL dragging;

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog("Touches Began 1");
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(btnOpen.frame, touchLocation))
    {
        NSLog("Touches Began 2");
        dragging = YES;
        oldX = touchLocation.x;
        oldY = touchLocation.y;
    }
}

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

    if (dragging)
    {
        NSLog("Dragging!");
        CGRect frame = mainView.frame;
        frame.origin.x = mainView.frame.origin.x + touchLocation.x - oldX;
        frame.origin.y =  mainView.frame.origin.y + touchLocation.y - oldY;
        mainView.frame = frame;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog("Touches Ended!");
    dragging = NO;
}


- (void)viewDidLoad
{    
    [btnOpen addTarget:self action:@selector(touchesBegan:withEvent:) forControlEvents: UIControlEventTouchDown];
    [btnOpen addTarget:self action:@selector(touchesMoved:withEvent:) forControlEvents: UIControlEventTouchDragInside];
    [btnOpen addTarget:self action:@selector(touchesEnded:withEvent:) forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
}
4

2 に答える 2

3

メインビューのフレームに関連するタッチの座標を求めています

CGPoint touchLocation = [touch locationInView:self.view];

touchLocation次に、の位置がボタンフレームのフレーム内にあるかどうかを尋ねます

if (CGRectContainsPoint(btnOpen.frame, touchLocation))

言い換えれば。タッチがボタンの範囲内にあるかどうかを確認していますが、ボタンではなくメインビューで行われたタッチの座標で確認しています。

だからこれはあなたがすべきことです:

CGPoint touchLocation = [touch locationInView:btnOpen];
于 2012-08-09T11:40:18.977 に答える
2
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog("Touches Began 1");
for (UITouch *touch in touches) {
    //UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(btnOpen.frame, touchLocation))
    {
        NSLog("Touches Began 2");
        //dragging = YES;
        oldX = touchLocation.x;
        oldY = touchLocation.y;
    }
}
}

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
   // UITouch *touch = [[event allTouches] anyObject];
for (UITouch *touch in touches) {
    CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(btnOpen.frame, touchLocation))
    {
        NSLog("Dragging!");
        CGRect frame = mainView.frame;
        frame.origin.x = mainView.frame.origin.x + touchLocation.x - oldX;
        frame.origin.y =  mainView.frame.origin.y + touchLocation.y - oldY;
        mainView.frame = frame;
    }
}
}

このように試してみてください。参考になると思います。

于 2012-08-09T12:00:24.963 に答える