UITableViewCells にパンを追加しようとしていますが、次のコードがあります。ストーリーボードからクラスを参照してデリゲートを設定したにもかかわらず、何らかの理由で handlepan メソッドが呼び出されません。
#import <QuartzCore/QuartzCore.h>
#import "TaskTableViewCell.h"
@implementation TaskTableViewCell {
CAGradientLayer* _gradientLayer;
CGPoint _originalCenter;
BOOL _deleteOnDragRelease;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// add a layer that overlays the cell adding a subtle gradient effect
_gradientLayer = [CAGradientLayer layer];
_gradientLayer.frame = self.bounds;
_gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor],
(id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor],
(id)[[UIColor clearColor] CGColor],
(id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]];
_gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f];
[self.layer insertSublayer:_gradientLayer atIndex:0];
// add a pan recognizer
UIPanGestureRecognizer* recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
recognizer.delegate = self;
[self addSubview:self.taskTextLabel];
[self addSubview:self.priorityView];
[self addGestureRecognizer:recognizer];
}
return self;
}
-(void)layoutSubviews {
[super layoutSubviews];
_gradientLayer.frame = self.bounds;
}
#pragma mark - horizontal pan gesture methods
-(BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
CGPoint translation = [gestureRecognizer translationInView:[self superview]];
// Check for horizontal gesture
if (fabsf(translation.x) > fabsf(translation.y)) {
return YES;
}
return NO;
}
-(void)handlePan:(UIPanGestureRecognizer *)recognizer {
NSLog(@"Pan");
// 1
if(recognizer.state == UIGestureRecognizerStateBegan) {
// if the gesture has just started, record the current centre location
_originalCenter = self.center;
}
// 2
if(recognizer.state == UIGestureRecognizerStateChanged) {
// translate the center
CGPoint translation = [recognizer translationInView:self];
self.center = CGPointMake(_originalCenter.x + translation.x, _originalCenter.y);
// determine wheter the item has been dragged far enough to initiate a delete / complete
_deleteOnDragRelease = self.frame.origin.x < -self.frame.size.width / 2;
}
// 3
if (recognizer.state == UIGestureRecognizerStateEnded) {
// the frame this cell would have had before being dragged
CGRect originalFrame = CGRectMake(0, self.frame.origin.y, self.bounds.size.width, self.bounds.size.height);
if(!_deleteOnDragRelease) {
// if the item is not being deleted, snap back to the original location
[UIView animateWithDuration:0.2 animations:^{
self.frame = originalFrame;
}
];
}
}
}
クラスのヘッダーファイルは次のとおりです。
#import <UIKit/UIKit.h>
#import "Task.h"
@interface TaskTableViewCell : UITableViewCell <UIGestureRecognizerDelegate>
@property (strong, nonatomic) Task *task;
@property (weak, nonatomic) IBOutlet UIView *priorityView;
@property (weak, nonatomic) IBOutlet UILabel *taskTextLabel;
@end
また、xib ファイルではなく、ストーリーボードを使用していることを付け加えておきます。