0

当用户将手指放在特定单元格上时,单元格会根据用户的 x 轴改变颜色。我将如何从平移手势更改为滑动手势。我想构建它,以便在单元格上滑动而不是平移,以显示其背后的颜色。然后,当用户抬起手指时,单元格应弹回原位。有小费吗?

  @synthesize _panRecognizer;

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
 {
if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])
{
    NSInteger emoteY = floor((self.frame.size.height - 32) / 2);

    _panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(respondToPanGesture:)];
    [_panRecognizer setDelegate:self];
    [_panRecognizer setMinimumNumberOfTouches:1];
    [_panRecognizer setMaximumNumberOfTouches:1];
    [self addGestureRecognizer:_panRecognizer];

 //        [[self textLabel] setFont:[UIFont boldSystemFontOfSize:18.0]];
    [[self textLabel] setFont:[UIFont systemFontOfSize:24.0]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];

    _border = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, self.frame.size.height)];
    [self addSubview:_border];

    _rightEmote = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.width - 42, emoteY, 32, 32)];
    [self addSubview:_rightEmote];

    _leftEmote = [[UIImageView alloc] initWithFrame:CGRectMake(-32, emoteY, 32, 32)];
    [self addSubview:_leftEmote];
}

return self;
}

 - (void)setFrame:(CGRect)frame
 {
      [super setFrame:frame];

CGRect borderFrame = _border.frame,
rightEmoteFrame = _rightEmote.frame,
leftEmoteFrame = _leftEmote.frame;

NSInteger emoteY = floor((self.frame.size.height - 32) / 2);

borderFrame.size.height = self.frame.size.height;
rightEmoteFrame.origin.y = emoteY;
leftEmoteFrame.origin.y = emoteY;

[_border setFrame:borderFrame];
[_rightEmote setFrame:rightEmoteFrame];
[_leftEmote setFrame:leftEmoteFrame];
}

 - (DDFactor *)factor
{
    return _factor;
 }

 - (void)setFactor:(DDFactor *)factor
 {
_factor = factor;

}

- (void)respondToPanGesture:(UIGestureRecognizer *)recognizer
 {
 //    NSLog(@"%lu", [recognizer state]);

NSInteger rstate = [recognizer state];
CGFloat touchX = 0.0;

if ([recognizer numberOfTouches] == 1)
{
    touchX = [recognizer locationOfTouch:0 inView:self].x;

    if (rstate == UIGestureRecognizerStateBegan)
    {
        /*
         animate to color under touch
         */

        CGRect labelFrame = [self textLabel].frame;
        labelFrame.origin.x += 42;

        CGRect rightEmoteFrame = _rightEmote.frame;
        rightEmoteFrame.origin.x += 42;
        CGRect leftEmoteFrame = _leftEmote.frame;
        leftEmoteFrame.origin.x += 42;

        [UIView animateWithDuration:0.3 animations:^{
            [_border setAlpha:0.0];
            [[self textLabel] setTextColor:[UIColor whiteColor]];
            [[self textLabel] setFrame:labelFrame];
            [_rightEmote setFrame:rightEmoteFrame];
            [_leftEmote setFrame:leftEmoteFrame];
        }];
        [self animateEmoticonsWithColor:NO duration:0.3];
    }
    else if (rstate == UIGestureRecognizerStateChanged)
    {
        /*
         alter color
         trigger emote animation if necessary
         */

        if ([self responseForTouchPosition:touchX] != _responseValue)
        {
            [self setResponseValue:[self responseForTouchPosition:touchX]];
            [_border setBackgroundColor:[UIColor colorForResponse:_responseValue]];
            [self animateToBackgroundColor:[UIColor colorForResponse:_responseValue]];
            [self animateEmoticonsWithColor:NO duration:0.2];
        }
    }
}
else if (([recognizer numberOfTouches] == 0) && (rstate == 3))
{
    CGRect labelFrame = [self textLabel].frame;
    labelFrame.origin.x -= 42;

    CGRect rightEmoteFrame = _rightEmote.frame;
    rightEmoteFrame.origin.x -= 42;
    CGRect leftEmoteFrame = _leftEmote.frame;
    leftEmoteFrame.origin.x -= 42;

    [UIView animateWithDuration:0.3 animations:^{
        [_border setAlpha:1.0];
        [_rightEmote setFrame:rightEmoteFrame];
        [_leftEmote setFrame:leftEmoteFrame];
        [[self textLabel] setFrame:labelFrame];
        [[self textLabel] setTextColor:[UIColor colorForResponse:_responseValue]];
        [self setBackgroundColor:[[UIColor colorForResponse:_responseValue] colorWithAlphaComponent:0.1]];
    }];
    [self animateEmoticonsWithColor:YES duration:0.3];
}

}

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated
 {
[super setSelected:selected animated:animated];

// Configure the view for the selected state
 }

- (DDResponseValue)responseForTouchPosition:(CGFloat)x
 {
DDResponseValue response;

if (x <= 70) response = DDResponseGrin;
else if (x <= 120) response = DDResponseSmile;
else if (x <= 170) response = DDResponseSad;
else if (x <= 220) response = DDResponseNervous;
else if (x <= 270) response = DDResponseRefusal;
else response = DDResponseNeutral;

return response;
 }
4

1 回答 1

1

您可以使用该UISwipeGestureRecognizer状态,并且可以为所欲为。看看下面的代码,

- (void)swipeGestureMethod:(UISwipeGestureRecognizer *)recognizer {

   CGPoint point = [recognizer locationInView:[recognizer view]];
   if (recognizer.state == UIGestureRecognizerStateBegan) {

   } else if (recognizer.state == UIGestureRecognizerStateEnded) {

   }

}
于 2013-10-31T05:34:58.850 回答