简体   繁体   English

iOS,自定义UIView上的UISwipeGestureRecognizer-不起作用

[英]iOS, UISwipeGestureRecognizer on Custom UIView - not working

I am unable to have a successful UISwipeGestureRecognizer set onto my custom view. 我无法在我的自定义视图上成功设置UISwipeGestureRecognizer。 I have tested on the main self.view with success, but i cannot get it to work on my custom. 我已经对主要的self.view进行了测试,并取得了成功,但是我无法使其按我的习惯工作。

Parent.m 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.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){

    }];
}

You need a separate gesture on each view. 您需要在每个视图上使用单独的手势。

add another UISwipeGestureRecognizer in your custom view with the direction set to downwards and call closebox method. 在自定义视图中添加另一个UISwipeGestureRecognizer,并将方向设置为向下,然后调用closebox方法。

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

[yourCustomView addGestureRecognizer:swipeGestDown];

You have 2 things to do to make this work: 要完成这项工作,您需要做两件事:

First, your UIView subclass has no frame or bounds because you used init and not initWithFrame: 首先,您的UIView子类没有framebounds因为您使用的是init而不是initWithFrame:

Second, you have to set a delegate on your main UIViewController and implement the - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch method. 其次,您必须在主UIViewController上设置一个delegate ,并实现- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch方法。 This works: 这有效:

in UISummaryCharView.m 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

in Parent.m 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;
}

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

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