簡體   English   中英

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

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

我無法在我的自定義視圖上成功設置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){

    }];
}

您需要在每個視圖上使用單獨的手勢。

在自定義視圖中添加另一個UISwipeGestureRecognizer,並將方向設置為向下,然后調用closebox方法。

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

[yourCustomView addGestureRecognizer:swipeGestDown];

要完成這項工作,您需要做兩件事:

首先,您的UIView子類沒有framebounds因為您使用的是init而不是initWithFrame:

其次,您必須在主UIViewController上設置一個delegate ,並實現- (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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM