TapGestureRecognizer不会被调用

时间:2012-03-26 06:50:27

标签: iphone objective-c ios xcode cocoa-touch

嗨,在viewDidLoad的主要WiewController中,我设置了一个

UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processTap)];

然后我在for循环中创建UIViews并将它们添加到滚动视图中,然后将其添加到主视图中。

       UIView *newsContainer = [[UIView alloc] initWithFrame:CGRectMake(160 * countnews, 30, 156, 126)];
       newsContainer.tag = countnews;
       newsContainer.userInteractionEnabled = YES;
       [newsContainer addGestureRecognizer:recognizer];            
       [tempScroll addSubview:newsContainer];

然后我有一个功能

- (void)processTap:(UITapGestureRecognizer *)recognizer {
    UIView *view = recognizer.view;
    NSLog(@"HELLO, %d", view.tag);
}

哪个从未被调用,有什么建议吗?非常感谢您的帮助。提前谢谢。

这是整个.m

#import "iPadMainViewController.h"
#import "GradeintView.h"
#import <QuartzCore/CALayer.h>
#import "Category.h"
#import "News.h"
#import "LazyImageView.h"
#import "TouchView.h"

@interface iPadMainViewController ()

@end

@implementation iPadMainViewController

@synthesize detailsView = _detailsView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processTap:)];
    [recognizer setDelegate:self];

    GradeintView *MainTitle = [[GradeintView alloc] initWithFrame:CGRectMake(0, 0, 1024, 50)];
    GradeintView *MainSubTitle = [[GradeintView alloc] initWithFrame:CGRectMake(0, 50, 1024, 30)];

    NSMutableArray *categoriesCollection = [[Category alloc] allCategoriesFromFeedAtUrl:@"http://geonews.ge/xml/category.php"];

    UIScrollView *categories = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 512, 768)];
    _detailsView = [[UIWebView alloc] initWithFrame:CGRectMake(500, 0, 512, 768)];
    [_detailsView addGestureRecognizer:recognizer];
    [categories setScrollEnabled:TRUE];
    [categories setContentSize:CGSizeMake(500, categoriesCollection.count * 156)];

    MainTitle.layer.masksToBounds = NO;
    MainTitle.layer.shadowOffset = CGSizeMake(3, 3);
    MainTitle.layer.shadowRadius = 5;
    MainTitle.layer.shadowOpacity = 0.3;

    [categories setBackgroundColor:[UIColor redColor]];

    int counter = 0;

    for (Category *cat in categoriesCollection)
    {
        UIView *categoryTitle = [[UIView alloc] initWithFrame:CGRectMake(0, 166 * counter
                                                                         , 500, 20)];

        UILabel *categoryLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, 200, 20)];

        [categoryLabel setBackgroundColor:[UIColor clearColor]];
        NSMutableArray *allCurrentNews = [[News alloc] allNewsFromCategory:cat.CategoryId];

        categoryLabel.text = cat.Name;
        categoryLabel.textColor = [UIColor whiteColor];

        [categoryTitle addSubview:categoryLabel];

        UIColor *myblack = [[UIColor alloc] initWithRed:0.14 green:0.14 blue:0.14 alpha:1];
        UIColor *ligheterBlac = [[UIColor alloc] initWithRed:0.227 green:0.22 blue:0.22 alpha:1];
        [categoryTitle setBackgroundColor:myblack];

        UIScrollView *tempScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 166 * counter, 500, 166)];

        UIColor *tempcolor = ligheterBlac; 
        tempScroll.layer.borderColor = [UIColor colorWithRed:0.34 green:0.34 blue:0.34 alpha:1].CGColor;
        tempScroll.layer.borderWidth = 0.5f;
        int countnews = 0;

        for (News *news in allCurrentNews)
        {
            UIView *newsContainer = [[UIView alloc] initWithFrame:CGRectMake(160 * countnews, 30, 156, 126)];
            newsContainer.tag = countnews;
            [newsContainer addGestureRecognizer:recognizer];

            //newsContainer.NewsId = news.NewsId;
            LazyImageView *image = [[LazyImageView alloc] initWithURl:[NSURL URLWithString:news.Thumbnail]];
            image.frame = CGRectMake(0, 0 , 156, 96);
            UILabel *newsTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 96, 156, 30)];
            newsTitle.backgroundColor = myblack;
            newsTitle.numberOfLines = 2;
            newsTitle.font = [UIFont systemFontOfSize:11];
            newsTitle.text = news.Title;
            newsTitle.textColor = [UIColor whiteColor];
            newsTitle.textAlignment = UITextAlignmentCenter;

            newsContainer.layer.borderColor = [UIColor colorWithRed:0.34 green:0.34 blue:0.34 alpha:1].CGColor;
            newsContainer.layer.borderWidth = 0.5f;

            [newsContainer addSubview:image];
            [newsContainer addSubview:newsTitle];

            countnews ++;
            [tempScroll setContentSize:CGSizeMake(allCurrentNews.count * 156, 96)];
            [tempScroll addSubview:newsContainer];
           //[image release];
        }

        [tempScroll setBackgroundColor: tempcolor];

        [categories addSubview:tempScroll];
        [categories addSubview:categoryTitle];
        [tempcolor release];
        [tempScroll release];
        counter ++;
    }

    self.detailsView.layer.masksToBounds = NO;
    self.detailsView.layer.shadowOffset = CGSizeMake(-10, 5);
    self.detailsView.layer.shadowRadius = 5;
    self.detailsView.layer.shadowOpacity = 0.3;


    [self.detailsView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.amazon.com"]]];
    [self.view addSubview:categories];
    [self.view addSubview:self.detailsView];
    [self.view addSubview:MainSubTitle];
    [self.view addSubview:MainTitle];

}

- (void)processTap:(UITapGestureRecognizer *)recognizer {
    UIView *view = recognizer.view;
    NSLog(@"HELLO, %d", view.tag);
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void)dealloc {
    [super dealloc];
}

- (void)loadDetailedContent:(NSString *)s
{
}

@end

8 个答案:

答案 0 :(得分:5)

更改

initWithTarget:self.view

initWithTarget:self

修改
你也忘记了冒号:

initWithTarget:self action:@selector(processTap:)

<强> EDIT2:
您已创建_detailsView(已分配UITapGestureRecognizer),但尚未将其添加到任何子视图中。它将如何运作?

答案 1 :(得分:5)

我认为问题在于包含你的视图的scrollView有自己的内部手势识别器,可以从你的轻拍手势识别器中“带走”触摸事件。尝试实现以下手势识别器委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

答案 2 :(得分:4)

您是否检查过“交互”设置? 在图像的“属性”检查器中,交互应设置为“启用用户交互”。

答案 3 :(得分:2)

试试这段代码

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processTap)];
[newsContainer addGestureRecognizer::gestureRecognizer];
 gestureRecognizer.cancelsTouchesInView = NO;

答案 4 :(得分:2)

将@selector(processTap)更改为@selector(processTap :)

因为现在你调用的方法不存在。

答案 5 :(得分:0)

我认为问题是,你可能错过了在头文件中添加<UIGestureRecognizerDelegate>

答案 6 :(得分:0)

您正在向UIGestureRecognizer添加UIWebview,不建议这样做。 UIWebview has its own UIGestureRecognizer对于过度驾驶很棘手。有关详细信息,请参阅此SO question

答案 7 :(得分:0)

你可以先将你的gestureRecognizer添加到self.view并检查你的方法是否被调用...以及检查这个帖子
                                                                              Issue with a UITapGestureRecognizer