2015-05-14 2 views
-4

У меня есть оператор if, который проверяет, перетаскивается ли перетаскиваемый imageViewimageView - который хранит количество перетаскиваемых элементов и изменяет изображение. У меня также есть заявление else-if, чтобы узнать, пересекались ли 2 imageViews с помощью счетчика imageView. Первое заявление if прекрасно работает, но когда я перетаскиваю еще один, на него ничего не происходит. Изображение не меняется. Я попытался сделать это следующим образом, но он, похоже, не работает.Операция Else-if не выполняется.

Кто-нибудь знает, почему и если есть лучший способ сделать это?

Мой код:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    for (UIImageView *letter in letterA) 
    { 
     if (CGRectIntersectsRect(letter.frame ,answerA.frame)) 
     { 
      UIImage *Pic1 = [UIImage imageNamed:@"number1"]; 
      [correctCounterA setImage:Pic1]; 
      letter.userInteractionEnabled=NO; 
      letter.hidden=YES; 

     } 
     else if(CGRectIntersectsRect(letter.frame ,answerA.frame) && CGRectIntersectsRect(letter.frame, answerA.frame)) 
     { 
      UIImage *Pic2 = [UIImage imageNamed:@"number2"]; 
      [correctCounterA setImage:Pic2]; 
      letter.userInteractionEnabled=NO; 
      letter.hidden=YES; 
     } 
    } 

} 
+3

X && Y является еще более ограничительным, чем X. Там нет ни одного случая, где 'X && X && Y'!. Переосмысление логической логики может быть ключевым здесь. –

+3

Особенно, так как это на самом деле 'X && X' ... – luk2302

+0

как бы я это сделал? Буква из массива 'UIImageViews'. Я пытался получить случайный случай каждый раз, но не повезло – Laury

ответ

0

Похоже, это то, что вы после:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    int intersectionCount = 0; 
    for (UIImageView *letter in letterA) { 
     if (CGRectIntersectsRect(letter.frame ,answerA.frame)) { 
      letter.userInteractionEnabled = NO; 
      letter.hidden = YES; 
      intersectionCount++; 
     } 
    } 

    if (intersectionCount == 1) { 
     UIImage *Pic1 = [UIImage imageNamed:@"number1"]; 
     [correctCounterA setImage:Pic1]; 
    } 

    else if (intersectionCount == 2) { 
     UIImage *Pic2 = [UIImage imageNamed:@"number2"]; 
     [correctCounterA setImage:Pic2]; 
    } 
} 

Или, возможно, в более общем плане:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    int intersectionCount = 0; 
    for (UIImageView *letter in letterA) { 
     if (CGRectIntersectsRect(letter.frame ,answerA.frame)) { 
      letter.userInteractionEnabled = NO; 
      letter.hidden = YES; 
      intersectionCount++; 
     } 
    } 

    if (intersectionCount == 0) { 
     [correctCounterA setImage:nil]; 
    } 

    else { 
     NSString *imageName = [NSString 
      stringWithFormat:@"number%d", intersectionCount]; 
     UIImage *image = [UIImage imageNamed:imageName]; 
     [correctCounterA setImage:image]; 
    } 
} 
+0

Это своего рода работа, но по какой-то причине, когда я пытаюсь добавить какие-либо из' imageViews', он не работает. Он принимает конкретные, а не случайные. Это потому, что я использую 'IBOutletCollection'? Есть ли способ сделать это случайным, поэтому это не имеет значения, в каком порядке я их таскаю? – Laury

+0

На самом деле это соответствует шаблону. Первое перетаскивание изменится на число1, второе ничего не сделает, третье изменится на число2, а четвертое изменит его на число 1, любые идеи, почему это так? – Laury

1

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

Ваш текущий вопрос: Если письмо пересекает ответ, сделайте что-нибудь. Если письмо не пересекает ответ, то если буква пересекает ответ и письмо пересекает ответ, сделайте что-то еще.

Мне не хватает какой-то альтернативы здесь ...

+0

Я попробовал' +, && 'и некоторые другие операторы, но ни один из них не работает, есть ли способ сделать это по-другому? – Laury

+0

Конечно, зависит от того, чего вы хотите достичь. В настоящее время ваш случай else - это особый случай оператора if - вы можете поместить его внутри сначала, если это то, что вы хотите ... – dogsgod

+0

Пожалуйста, попробуйте объяснить, чего вы хотите достичь, поэтому я могу указать вам в правильном направлении – dogsgod

0

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

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UIImageView *imageViewOne; 
@property (weak, nonatomic) IBOutlet UIImageView *imageViewTwo; 
@property (weak, nonatomic) IBOutlet UIImageView *imageViewThree; 
@property (weak, nonatomic) IBOutlet UIImageView *imageViewFour;  
@property (nonatomic) BOOL hasView; 
@property (strong, nonatomic) NSArray *imageViewCollection; 
@property (strong, nonatomic) UIImageView *viewToDrag; 
@property (weak, nonatomic) IBOutlet UIImageView *destinationView; 
@property (nonatomic) NSUInteger destinationViewCounter; 
@property (nonatomic) CGPoint originalLocation; 
@end 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.imageViewCollection = @[_imageViewOne, _imageViewTwo, _imageViewThree, _imageViewFour]; 
    self.view.multipleTouchEnabled = NO; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchLocation = [touch locationInView:self.view]; 

    for(UIImageView *view in _imageViewCollection) { 
     if(CGRectContainsPoint(view.frame, touchLocation)) { 
      self.originalLocation = view.center; 
      self.viewToDrag = view; 
      self.hasView = YES; 
     } 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if(self.hasView) { 
     UITouch *touch = [[event allTouches] anyObject]; 
     CGPoint touchLocation = [touch locationInView:self.view]; 
     self.viewToDrag.center = touchLocation; 
     [self.view bringSubviewToFront: self.viewToDrag]; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if(CGRectIntersectsRect(self.destinationView.frame, self.viewToDrag.frame)) { 
     NSUInteger tagNumber = self.viewToDrag.tag; 
     [self removeImageForTagNumber:tagNumber]; //to remove imageViews after dragged 
     self.viewToDrag.center = self.originalLocation; 
     self.destinationViewCounter++; 
     self.viewToDrag = nil; 
     if(self.destinationViewCounter > 4) { 
      self.destinationViewCounter = 0; //if we're out of range reset the counter 
     } 
     self.destinationView.image = [self imageForNumber:self.destinationViewCounter]; //convenience method to grab the correct image (correlating to the counter) 
    } 
    self.viewToDrag.center = self.originalLocation; //snap the imageView back into place 
    self.hasView = NO; 
} 

- (void)removeImageForTagNumber:(NSUInteger)number { 
    switch (number) { 
     case 1: 
      [_imageViewOne removeFromSuperview]; 
      break; 
     case 2: 
      [_imageViewTwo removeFromSuperview]; 
      break; 
     case 3: 
      [_imageViewThree removeFromSuperview]; 
      break; 
     case 4: 
      [_imageViewFour removeFromSuperview]; 
     default: 
      return; 
    } 
} 

Я также создал пример проекта для вас here

+0

Это отлично работает, но знаете ли вы, как сделать 'imageView'disappear после его перетаскивания правильно? – Laury

+0

Да.Существует несколько способов сделать это, но это самое простое, что приходит на ум: 0)) установить номера тегов для ваших изображений в виде раскадровки или программно 2) теперь 'viewToDrag' сможет точно сказать, какой' imageView' нам нужно будет удалить, если он достигнет «destinationView» . 3) Внесите простой метод удобства для ввода числа и удалите соответствующий 'imageView' – BenJammin

+0

, как установить теги? – Laury

Смежные вопросы