2013-07-09 2 views
0

Я создаю приложение с карточками. В моей mainViewController, у меня есть этот код:идентифицировать касания подкласса UIView, созданного программно в iOS

CardView *cardView = [[CardView alloc] initWithFrame:CGRectMake(0, 0, CardWidth, CardHeight)]; 
        cardView.card = [player.closedCards cardAtIndex:t]; 
        [self.cardContainerView addSubview:cardView]; 
        [cardView animateDealingToBottomPlayer:player withIndex:t withDelay:delay]; 
        delay += 0.1f; 

где CardView является подкласс UIView. Каждая карта представляет собой уникальный cardView и в CardView.m. У меня есть:

@implementation CardView 
{ 
    UIImageView *_backImageView; 
    UIImageView *_frontImageView; 
    CGFloat _angle; 
} 

@synthesize card = _card; 

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) 
    { 
     self.backgroundColor = [UIColor clearColor]; 
     [self loadBack]; 
     self.userInteractionEnabled=YES; 
    } 
    return self; 
} 

- (void)loadBack 
{ 
    if (_backImageView == nil) 
    { 
     _backImageView = [[UIImageView alloc] initWithFrame:self.bounds]; 
     _backImageView.image = [UIImage imageNamed:@"Back"]; 
     _backImageView.contentMode = UIViewContentModeScaleToFill; 
     [self addSubview:_backImageView]; 
    } 
} 

и реализации для других функций.

Поскольку для того, чтобы выиграть место, одна карта помещается поверх других (половина карты видна, а остальная часть покрыта следующей картой и т. Д.), Я хочу определить штрихи на каждой карте.

Если я помещаю этот код в CardView:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"Card is touched"); 
} 

она никогда не называется. Если я поместил его в GameView Controller, он называется где угодно, я коснусь его, но я не знаю, как определить, какой cardView вызывается. Можете ли вы дать мне подсказку?

EDIT: Я решил использовать жесты. Поэтому в моем mainViewController был изменен код:

for (PlayerPosition p = startingPlayer.position; p < startingPlayer.position + 4; ++p) 
{ 
    CardView *cardView = [[CardView alloc] initWithFrame:CGRectMake(0, 0, CardWidth, CardHeight)]; 
    cardView.card = [player.closedCards cardAtIndex:t]; 
    cardView.userInteractionEnabled=YES; 
    [self.cardContainerView addSubview:cardView]; 
    [cardView animateDealingToBottomPlayer:player withIndex:t withDelay:delay]; 
    delay += 0.1f; 
    UITapGestureRecognizer *recognizer=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(cardSelected:)]; 
    [cardView addGestureRecognizer:recognizer]; 
} 

но это никогда не называется.

-(void)cardSelected:(UITapGestureRecognizer *)recognizer 
{ 
    NSLog(@"Card Selected with gestures"); 
} 

Почему?

EDIT 2:

Я также попытался добавить это:

self.cardContainerView.userInteractionEnabled=YES; 

или это изменить:

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

к этому:

UITapGestureRecognizer *recognizer=[[UITapGestureRecognizer alloc]initWithTarget:self .cardContainerView action:@selector(cardSelected:)]; 

, но никто из них не работал.

+0

Вы считали распознаватели жеста? – Wain

+0

@Wain Я не использовал их раньше, чтобы быть честным, и я не знал, как реализовать. Считаете ли вы, что это будет проще? – ghostrider

+0

Это может быть не самый лучший способ, но вы можете получить x и y касания, и если у вас есть кадр каждой карты, вы можете увидеть, какой из них был затронут. Я бы рекомендовал распознаватели жестов. –

ответ

1

Если вы вместо этого добавили распознаватель жестов к каждому виду карты, вы можете получить обратный вызов к указанному методу, а жест связан с представлением, чтобы вы могли напрямую получить ссылку на него.


Ваш CardView (который я предполагаю, что это подкласс UIView?) Имеет 2 подвидами, которые вид изображения:

UIImageView *_backImageView; 
UIImageView *_frontImageView; 

Вы можете захотеть установить userInteractionEnabled в YES на одном или обоих из них (в зависимости от того, когда карта должна быть сбрасываемой, а также когда скрытые объекты отображаются и скрыты).

Вы также можете выступать в роли делегата этого жеста (если вам нужно или просто временно отладить, что жест запускается, но заблокирован чем-то другим жестом).

+0

Можете ли вы увидеть мое редактирование? – ghostrider

+0

У вас есть изображения в виде подзонов, они, вероятно, блокируют касания, поскольку по умолчанию они отключают 'userInteractionEnabled'. Вы должны иметь возможность включать штрихи без побочных эффектов. – Wain

+0

Вы имеете в виду нечто иное, чем это: cardView.userInteractionEnabled = YES; ? Вышеприведенный код происходит внутри цикла for, если он имеет какое-либо значение. – ghostrider