自定义UIView上的iOS,UISwipeGestureRecognizer - 无法正常工作

时间:2015-07-23 08:33:27

标签: ios uiview uiswipegesturerecognizer

我无法在自定义视图中设置成功的UISwipeGestureRecognizer。 我已在主self.view上测试成功,但我不能让它在我的自定义上工作。

Parent.m

@property (strong, nonatomic) UISummaryChartView *chartView;

...

- (void)viewDidLoad {
    [super viewDidLoad];
    self.chartView = [[UISummaryChartView alloc] initWithWidth:self.view.frame.size.width andHeight:self.view.frame.size.height withView:self.view];
    [self.chartView openBox];

    UISwipeGestureRecognizer *swipeGest = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDetected:)];
    [swipeGest setDirection:(UISwipeGestureRecognizerDirectionUp)];

    [self.view addGestureRecognizer:swipeGest];
}

-(void)swipeDetected: (UISwipeGestureRecognizer *) sender{
    NSLog(@"swiped..");
    if(self.chartView.frame.size.height > 50){
        //chart view is open
        NSLog(@"closing");
        [self.chartView closeBox];
    }
}

UISummaryChartView.h

UISummaryChartView : UIView

-(id) initWithWidth:(CGFloat)inWidth andHeight:(CGFloat)inHeight withView: (UIView*) theView{
    self = [super init];

    self.mainView = theView;
    //super view bounds
    self.viewWidth = inWidth;
    self.viewHeight = inHeight;
    CGFloat startx = 2;
    CGFloat starty = 0;
    self.width = self.viewWidth - 10;
    self.height = (self.viewHeight / 100) * 50;
    self.view1Frame = CGRectMake(startx, starty, self.width, self.height);

    return self;
}

-(void) openBox{
    CGRect startFrame = CGRectMake(0, 10, self.mainView.frame.size.width, 1);
    self.view1 = [[UIView alloc] initWithFrame:startFrame];
    [self.mainView addSubview:self.view1];
    [UIView animateWithDuration:0.5 animations:^(void){
        [self.view1 setBackgroundColor:[UIColor colorWithRed:(float)126/255.0 green:(float)35/255.0 blue:(float)32/255.0 alpha:1]];
        self.view1.frame = self.view1Frame;
    } completion:^(BOOL finished){

    }];
}

2 个答案:

答案 0 :(得分:0)

每个视图都需要单独的手势。

在自定义视图中添加另一个UISwipeGestureRecognizer,方向设置为向下并调用closebox方法。

UISwipeGestureRecognizer *swipeGestDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(closeBox)];
[swipeGestDown setDirection:(UISwipeGestureRecognizerDirectionDown)];

[yourCustomView addGestureRecognizer:swipeGestDown];

答案 1 :(得分:0)

要完成这项工作,您需要做两件事:

首先,您的UIView子类没有framebounds,因为您使用了init而不是initWithFrame:

其次,您必须在主delegate上设置UIViewController并实施- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch方法。这有效:

UISummaryCharView.m

中的

#import "UISummaryChartView.h"

@implementation UISummaryChartView

@synthesize mainView;

-(id) initWithWidth:(CGFloat)inWidth andHeight:(CGFloat)inHeight withView: (UIView*) theView{
    self = [super initWithFrame:theView.frame]; // THIS IS IMPORTANT
    self.mainView = theView;
    //super view bounds
    self.viewWidth = inWidth;
    self.viewHeight = inHeight;
    CGFloat startx = 2;
    CGFloat starty = 0;
    self.width = self.viewWidth - 10;
    self.height = (self.viewHeight / 100) * 50;
    self.view1Frame = CGRectMake(startx, starty, self.width, self.height);
    NSLog(@"frame %@",NSStringFromCGRect(self.frame));
    NSLog(@"bounds %@",NSStringFromCGRect(self.bounds));
    return self;
}

-(void) openBox{

    CGRect startFrame = CGRectMake(0, 10, self.mainView.frame.size.width, 1);
    self.view1 = [[UIView alloc] initWithFrame:startFrame];
    [self.mainView addSubview:self.view1];
    [UIView animateWithDuration:0.5 animations:^(void){
        [self.view1 setBackgroundColor:[UIColor colorWithRed:(float)126/255.0 green:(float)35/255.0 blue:(float)32/255.0 alpha:1]];
        self.view1.frame = self.view1Frame;
    } completion:^(BOOL finished){
        NSLog(@"frame %@",NSStringFromCGRect(self.frame));
        NSLog(@"bounds %@",NSStringFromCGRect(self.bounds));
    }];
}


-(void)closeBox{
    NSLog(@"close box");
    // your closeBox method
}

@end
Parent.m

中的

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.chartView = [[UISummaryChartView alloc] initWithWidth:self.view.frame.size.width andHeight:self.view.frame.size.height withView:self.view];
    [self.chartView openBox];

    UISwipeGestureRecognizer *swipeGest = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDetected:)];
    [swipeGest setDirection:(UISwipeGestureRecognizerDirectionUp)];

    [[self view] addSubview:self.chartView];

    self.chartView.userInteractionEnabled = YES;
    [self.chartView addGestureRecognizer:swipeGest];
    swipeGest.delegate = self;


}

-(void)swipeDetected: (UISwipeGestureRecognizer *) sender{
    NSLog(@"swiped..");
    if(self.chartView.frame.size.height > 50){
        //chart view is open
        NSLog(@"closing");
        [self.chartView closeBox];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    NSLog(@"shouldReceiveTouch?");
    return YES;
}