ICarousel останавливается на выбранном пользователем индексе

EDIT:

Я создаю приложение, такое как Slot Machine, я добавил iCarousel для объекта слота. Поэтому у меня есть кнопка, которая вращает iCarousel. В моем iCarousel есть два слота (Slot1 и Slot2). Ниже приведен мой iCarouselView: (В поле находится TWO carousel)

enter image description here

Вот как я вращаю свой iCarousel:

-(IBAction) spin {

[carousel1 scrollByNumberOfItems:-35 duration:10.7550f];
[carousel2 scrollByNumberOfItems:-35 duration:10.7550f];

}

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

Я сделал это так, изображение ниже - это newViewcontroller, в котором содержится UIImageView с кнопкой в ​​нем, поэтому, когда пользователь забирает его, появляется сообщение CustomPicker. Мой CustomPicker содержит изображение того, что пользователь выбрал на рулоне камеры. Поэтому каждая кнопка имеет определенное значение, отправленное на мой iCarouselView. карусель1 для слота1 и карусель2 для слота2.

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

Извините за мой плохой английский. enter image description here

Ответ 1

Это легко. Раньше я делал что-то подобное.

В следующем ниже примере:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index             reusingView:(UIView *)view{

   //Configure your view here
   ..... 

  //Add a button on each view of the carousel
  UIButton * someButton = [[UIButton alloc] initWithFrame:view.bounds];
     [someButton setAlpha:0.0];
     [someButton addTarget:self action:@selector(fingerLanded:) forControlEvents:UIControlEventTouchDown];
     [view addSubview:someButton];
     [view bringSubviewToFront:someButton];

    //Add a tag - correspond it to the index
     someButton.tag = index;

   //Make sure the view is user interaction enabled
   [view setUserInteractionEnabled:YES];

    //Also make sure the button can actually receive touches and there is no view 
    //blocking touch events from being sent to the button.

  return view;
}

Также добавьте

- (void) fingerLanded:(id) sender{

UIButton * theButtonFingerLandedOn = (UIButton *) sender;

//This is the index the user tapped his finger on
NSUInteger index = theButtonFingerLandedOn.tag;

//Scroll to that particular index
[self.carousel scrollToItemAtIndex:index animated:YES];

}

Также добавьте

- (void) viewDidLoad{

  //You may need this to enable user interaction on a view flying by    
  // Look in the - (void)transformItemViews method of the iCarousel library
  self.carousel.centerItemWhenSelected = NO;

 }

Вы должны сделать что-то подобное. Надеюсь, это было полезно:)!!

Ответ 2

Без расширения UIButton вы можете добавить уникальную TAG к кнопке, получив тег из источника UIEvent.

IE:

-(void) buttonSetupMethod {
    for(each item) {
        UIButton * button = [[UIButton alloc] init];
        ... additional setup ...
        button.tag = SOME_UNIQUE_TAG_FOR_BUTTON;
        [button addTarget:self action:@selector(processaction:) forControlEvents:desiredEvents];
        ... retain button ...
     [button release];
    }
 }

 -(void) processAction:(id) source
 {
     UIButton * button = (UIButton *) source;
     int tag = button.tag;
     ... conditional logic on specific tag ...
 }

для получения дополнительной информации о параметрах передачи см.: Передача параметров при действии кнопки: @selector

Ответ 3

Почему бы вам не сделать свою идею tableview, выполните следующий рутинный вызов:

[carousel scrollByNumberOfItems:-35 duration:10.7550f];

и поместите это в другую процедуру не-действия, а метод TableView didSelectItemAtIndex вызовет вашу новую подпрограмму и вызовет ее подпрограмму.

-(void)newRoutineToCall:(int)itemsToMove{
    [carousel scrollByNumberOfItems:itemsToMove duration:10.7550f];
}

-(IBAction) spin {        
    [self newRoutineToCall:-35];
} 

Затем выполните

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [self newRoutineToCall:[indexPath row]];
}

Ответ 4

Хорошо, позвольте мне перефразировать вопрос: у вас есть массив изображений "imageArray" с одним специальным "carousel1Image" (выбранным newViewController). Вы хотите, чтобы карусель проходил вокруг и вокруг в течение N секунд, а затем приземлялся на специальный?

Если это правильно, что-то вроде этого должно работать...

-(void) spinCarousel: (iCarousel *) carousel toIndex:(NSInteger) targetIndex { 
    NSInteger imagesPerSecond = 5;
    double secondsToScroll = 10.7550f;

    NSUInteger currIndex = [carousel currentItemIndex];
    NSUInteger numItems = [carousel numberOfItems] + [carousel numberOfPlaceholders];
    NSUInteger timesAround = floor(secondsToScroll*imagesPerSecond/numItems);
    NSInteger numToScroll = timesAround*numItems + targetIndex-currIndex;
    [carousel scrollByNumberOfItems:numToScroll duration: secondsToScroll];

}

[self spinCarousel: carousel1 toIndex:[imageArray indexOfItem:carousel1Image]];
[self spinCarousel: carousel2 toIndex:[imageArray indexOfItem:carousel2Image]];

==== Старый ответ ====

Я разделяю путаницу других о том, какова цель. Например, не понятно, что такое "цена" и что она имеет отношение к вашему игровому автомату? "Я хочу, чтобы пользователь выбирал свою последнюю цену, это означает, что последнее представление или изображение, где моя icarousel может остановиться" Извините, но это не соответствует моему пониманию слова "цена".

Но прочитав ваш сценарий в конце: "то, что я хочу, - это когда пользователь нажимает на UITableViewCell или эскиз с определенным изображением из массива, он передает что-то/значение моему спину UIButton, чтобы изображение щелкнуло UITableViewCell будет последней ценой". Я интерпретирую это как ЕЩЕ есть одно значение, которое ваша кнопка отжима должна иметь доступ к ИЛИ, что есть значение для КАЖДОГО изображения, к которому должен иметь доступ спин-кнопка. Любой из них кажется простым, поэтому я не уверен, почему вопрос.

Предполагая, что это первая (единственная цена), почему вы не можете просто настроить ваш контроллер настроек с этим значением (так же, как вы передаете изображение NSMutableArray)?

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