[英]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
子類沒有frame
或bounds
因為您使用的是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.