2

结构 UIViewController - UIScrollview - UIButton

我要让滚动视图可以接收按钮事件。因此,每当用户在按钮上滚动(拖动)时,滚动视图都会做出滚动反应。

我按下按钮并使用事件转发移动处理程序,如下所示

- (IBAction)buttonTouchedMove:(id)sender withEvent:(UIEvent *)event {
    [[sender nextResponder] touchesMoved:[event allTouches] withEvent:event];
}
- (IBAction)buttonTouchedDown:(id)sender withEvent:(UIEvent *)event {
    [[sender nextResponder] touchesBegan:[event allTouches] withEvent:event];
}

并随着触摸的变化移动滚动视图,我做了以下代码

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    self.oldPoint = [touch locationInView:self.view];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint offset = self.scrollView1.contentOffset;
    UITouch *touch = [touches anyObject];
    self.newPoint = [touch locationInView:self.view];
    int diffX = newPoint.x - oldPoint.x;
    offset.x = offset.x - diffX;
    [scrollView1 setContentOffset:offset animated:YES];
    self.oldPoint = self.newPoint;
}

但是,滚动视图反应很奇怪..当我触摸移动时移动不够。

4

2 回答 2

0
// get the button width

CGFloat buttonWidth = self.theButton.frame.size.width;
// replace your button name here


// now get the view width

CGFloat viewWidth = self.view.frame.size.width;
// replace your view name here

// now get the multiplier which i said u as 10

CGFloat mult = viewWidth / buttonWidth;

// and now use it in your code

.
.
.
 diffX = mult*(newPoint.x - oldPoint.x);
.
.
.
于 2012-05-21T05:48:35.190 回答
0

最终答案,使用 UIView 动画,我得到了我想要的。

- (IBAction)buttonTouchedDown:(id)sender withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    self.oldPoint = [touch locationInView:self.view];
    self.velocity = 0;
    isButtonTouchedDown = YES;
}

- (IBAction)buttonTouchedMove:(id)sender withEvent:(UIEvent *)event {
    CGPoint offset = self.scrollView1.contentOffset;
    UITouch *touch = [[event allTouches] anyObject];
    self.newPoint = [touch locationInView:self.view];
    int diffX = self.newPoint.x - self.oldPoint.x;
    velocity = diffX;

    offset.x = offset.x - diffX;
    [self.scrollView1 setContentOffset:offset animated:NO];
    self.oldPoint = self.newPoint;
}

有一个技巧..我通过区分 TouchedMove 函数中的移动距离来计算速度。在 Button TouchUp 事件处理程序中,我使用速度值和 CurveEaseout 动画控制 Scrollview 以滚动更多。通过提供非常短的动画持续时间并在没有事件(按下按钮)时重复它。它与滚动视图的动画非常相似。

- (IBAction)buttonTouchedUp:(id)sender withEvent:(UIEvent *)event {
    CGPoint offset = self.scrollView1.contentOffset;
    amountX = (self.velocity)*(abs(self.velocity));
    dX = amountX;
    isButtonTouchedDown = NO;
    if (offset.x - amountX < 0) {
        offset.x = 0;
        [scrollView1 setContentOffset:offset animated:YES];
    }
    else if (abs(dX) < 70) { // 70: content item size
        offset.x = roundf(offset.x/70)*70;
        [scrollView1 setContentOffset:offset animated:YES];
    }
    else {
        [self endScrollAnimation];
    }

- (void)startAnimation:(float)x moveAmount:(float)moveAmount
{
    CGPoint offset = self.scrollView1.contentOffset;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];

    offset.x = x < 0 ? offset.x + moveAmount : offset.x -moveAmount;

    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(endScrollAnimation)];
    [scrollView1 setContentOffset:offset animated:NO];
    [UIView commitAnimations];

}

- (void)endScrollAnimation
{
    CGPoint offset = self.scrollView1.contentOffset;
    float slowMoveAmount = abs(amountX) * 0.05;
    float fastMoveAmount = abs(amountX) * 0.1;
    if (isButtonTouchedDown) {
        return;
    }
    else if (abs(dX) > abs(amountX)*0.35 && offset.x > 0) {
        [self startAnimation:dX moveAmount:fastMoveAmount];
        dX  = dX < 0 ? dX + fastMoveAmount : dX -fastMoveAmount;
    }
    else if (abs(dX) > slowMoveAmount && offset.x > 0) {
        [self startAnimation:dX moveAmount:slowMoveAmount];
        dX = dX < 0 ? dX + slowMoveAmount : dX - slowMoveAmount;
    }
    else {
        offset.x = roundf(offset.x/70)*70;
        [scrollView1 setContentOffset:offset animated:YES];
    }
}
于 2012-05-25T11:33:46.730 回答