UITapGestureRecognizer仅在viewcontroller初始化和重新加载后才能工作

时间:2014-04-29 13:37:42

标签: ios objective-c uiviewcontroller uitapgesturerecognizer

在我的应用程序中,我有一个带有日历的视图控制器(CKCalendar)。只有一个月同时显示,滚动一个月可以切换几个月。在日历中的某些日子是由圆圈突出显示的事件。

使用代码

切换月份
- (void) nextMonth:(UISwipeGestureRecognizer *)swipe {
[self.calView moveCalendarToNextMonth];
[self drawItemsForCurrentMonth];
}

drawItemsForCurrentMonth方法为每个需要突出显示的项调用下一段代码。

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

NSArray* res = [self calculateDayCirclePosition:date];

CGFloat x = [[res objectAtIndex:0] floatValue] + (DEFAULT_CELL_WIDTH-DEFAULT_CIRCLE_WIDTH-CELL_BORDER_WIDTH)/2;
CGFloat y = [[res objectAtIndex:1] floatValue] + (DEFAULT_CELL_HEIGHT-DEFAULT_CIRCLE_WIDTH)/2;

AgendaCircleView* circleView = [[AgendaCircleView alloc] initWithFrame:CGRectMake(x,y,self.circleWidth,self.circleWidth)];

circleView.date = date;
AgendaViewController* avc;

if([appDelegate.viewController.frontViewController isKindOfClass:[UINavigationController class]]) {
    UINavigationController* navVC = (UINavigationController*)appDelegate.viewController.frontViewController;
    avc = (AgendaViewController*)[navVC visibleViewController];
}

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:avc action:@selector(didSelectDate:)];

tapGesture.enabled = YES;
tapGesture.delegate = avc;
tapGesture.numberOfTapsRequired = 1;
tapGesture.numberOfTouchesRequired = 1;

[circleView addGestureRecognizer:tapGesture];
circleView.userInteractionEnabled = YES;

circleView.alpha = 0.5;
circleView.layer.cornerRadius = (self.circleWidth/2);

if(fill) {
    circleView.backgroundColor = [appDelegate.dataController.rijschoolItem getColor1];
}
else {
    circleView.layer.borderWidth = 1.0f;
    circleView.backgroundColor = [UIColor clearColor];
    circleView.layer.borderColor = [UIColor whiteColor].CGColor;
}

[circleView setNeedsDisplay];

[self.calendarContainer addSubview:circleView];

[self.calendarContainer bringSubviewToFront:circleView];

[self.calendarContainer setUserInteractionEnabled:YES];

初始化viewcontroller时,此代码可以正常工作。单击圆圈将触发didSelectDate方法。但是,当我改变月份时,tapgesturerecognizer不再起作用。当更改月份时,我使用与初始化viewcontroller时使用的完全相同的代码。奇怪的是,当我打开另一个详细的视图控制器并将其扔到视图堆栈上并返回时,它再次起作用。

我试过用

gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer但这并没有解决问题。

此外,我尝试使用setNeedsLayout,但这也无效。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。因此对于可能遇到相同类型问题的其他人。在添加手势识别器时,您必须确保视图不是动画。

我有这段代码

[UIView animateWithDuration:0.4 animations:^{
   calendar.alpha = 1.0;
}];

[self drawItemsForCurrentMonth];

改为

[UIView animateWithDuration:0.4 animations:^{
    calendar.alpha = 1.0;
} completion:^(BOOL finished) {
    if(finished) {
        [self drawItemsForCurrentMonth];
    }
}];

在动画块之后使用drawItemsForCurrentMonth方法并不一定能保证块实际上已经完成。幸运的是,有一个覆盖这方面的完成块。