практическая прокрутка UIScrollView при встряхивании - PullRequest
1 голос
/ 09 августа 2010

HI,

У меня есть представление, которое имеет три UIScrollViews на экране. Я хочу случайным образом прокручивать UIScrollViews в разные позиции всякий раз, когда пользователь трясет iPhone, но я не могу этого сделать.

Я реализовал следующее в своем классе ViewController, чтобы обнаружить и обработать жест встряхивания, 3 UIScrollViews также принадлежат к тому же классу. Жест встряски обнаружен, но UIScrollViews не изменяются. Что я делаю не так?

Я пробовал и motionBegan, и motionEnded.

-(BOOL)canBecomeFirstResponder {
    return YES;
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (motion == UIEventSubtypeMotionShake)
    {
  int randomTag = arc4random() % [dirContents count];

  CGRect nextImageView = [[scrollView1 viewWithTag:2] frame];
  [scrollView1 scrollRectToVisible:nextImageView animated:YES];

  randomTag = arc4random() % [dirContents count];
  nextImageView = [[scrollView2 viewWithTag:4] frame];
  [scrollView2 scrollRectToVisible:nextImageView animated:YES];

  randomTag = arc4random() % [dirContents count];
  nextImageView = [[scrollView3 viewWithTag:4] frame];
  [scrollView3 scrollRectToVisible:nextImageView animated:YES];
  NSLog(@"Shake Detected End");
    }
}

Спасибо

Ответы [ 3 ]

0 голосов
/ 09 августа 2010

Вы уже пробовали использовать SetContentOffset вместо scrollRectToVisible?

если изображения в вашем tableView имеют одинаковую высоту, смещение для «элемента» всегда одинаково.

[scrollView3 setContentOffset:yourRandomOffsetInPixels animated:YES];

возможно, это работает.также учтите, что Проблема может заключаться в том, что ваш метод обнаружения дрожания работает в отдельном потоке , это будет означать, что вы должны вызывать свой метод motionEnded для основной темы следующим образом:

[self performSelectorOnMainThread:@selector(motionEnded) withObject:nil waitUntilDone:NO];
0 голосов
/ 09 августа 2010

Всего один быстрый вопрос.В вашем примере кода вы генерируете случайный тег:

randomTag = arc4random() % [dirContents count];

, но затем вы используете конкретное значение тега (4 в данном случае)?Я предполагаю, что это все еще не работает, когда вы используете значение randomTag?и что ты только что проводил какое-то тестирование?

 nextImageView = [[scrollView2 viewWithTag:4] frame];
0 голосов
/ 09 августа 2010

Проверяли ли вы свою переменную nextImageView, чтобы убедиться, что она правильная?

Более того, если вы пытаетесь использовать игровой автомат, я бы порекомендовал вам использовать UITableView вместо того, чтобы делать это самостоятельно.с scrollView

...