简体   繁体   English

将Pan UIGesture转换为滑动手势

[英]Converting Pan UIGesture to a Swipe Gesture

When the user pans their finger over the specific cell, the cell changes color depending on the x-axis of the user. 当用户将手指移到特定单元格上时,该单元格会根据用户的x轴更改颜色。 How would I go about changing from a pan gesture to a swipe. 我将如何从平移手势更改为滑动手势。 I would like to build it so that instead of panning, swiping on the cell reveals the color behind it. 我想构建它,以便在单元格上滑动而不是平移,可以显示其背后的颜色。 The cell should then snap back into place when the user lifts their finger. 然后,当用户抬起手指时,电池应重新卡入到位。 Any tips? 有小费吗?

  @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;
 }

You can use the UISwipeGestureRecognizer state and can do as what you want. 您可以使用UISwipeGestureRecognizer状态,并且可以按照自己的意愿进行操作。 Have a look on the following code, 看下面的代码,

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

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

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

   }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM