2015-07-23 4 views
1

Я не могу установить успешный UISwipeGestureRecognizer на свой пользовательский вид. Я успешно проверил на главном self.view, но я не могу заставить его работать над моим обычаем.iOS, UISwipeGestureRecognizer on Custom UIView - не работает

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){ 

    }]; 
} 
+0

вы хотите закрыть свой пользовательский вид с подобным жестом? – Matt

+0

Да, проведите по экрану, чтобы закрыть его. –

ответ

0

У вас есть 2 вещи, чтобы сделать, чтобы сделать эту работу:

Во-первых, ваш UIView подкласс не имеет frame или bounds, потому что вы использовали 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; 
} 
+0

Гений! Хороший совет по проблеме фрейма, я этого не осознал. Кроме того, добавление элементов диаграммы в собственные представления было ключевым шагом, который я пропустил. –

0

Вам нужен отдельный жест на каждом представлении.

добавьте еще один UISwipeGestureRecognizer в своем пользовательском представлении с направлением, установленным вниз, и вызовите метод closebox.

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

[yourCustomView addGestureRecognizer:swipeGestDown]; 
+0

ваш ответ касается распространенного непонятного вопроса UISwipeGestureRecognizer, однако не проблема. см. ответ Хуана Карлоса Оспины Гонсалес –