Получить индекс или значение тега из жестов

enter image description here

Это изображение из магазина приложений, когда мы ищем любое приложение. Я также хочу добавить ту же концепцию scrollview, в которой он показывает текущее изображение с небольшим предварительным просмотром предыдущего и следующего изображений. Я могу сделать это представление с помощью Пример кода. Но не нашел решения о том, как получить индекс или метку, когда пользователь нажимает любое изображение. Чтобы я мог открыть страницу подробностей для каждого изображения. Если у кого-то есть идея об этом, пожалуйста, помогите мне.

Спасибо заранее.

Ответ 1

Добавить распознаватель жестов в необходимый вид изображения:

UITapGestureRecognizer *frameTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(frameTapGesture:)];
[_imgView addGestureRecognizer:frameTapGesture];

Затем в обработчике жестов получите доступ к распознавателю жестов вида, прикрепленному к:

- (void)frameTapGesture:(UITapGestureRecognizer*)sender
{
    UIView *view = sender.view; //cast pointer to the derived class if needed
    NSLog(@"%d", view.tag);
}

Ответ 2

Рискуя сделать рекомендацию, не видя полную картину своего приложения, почему бы не использовать пользовательский UIButton вместо UIImageViews для этого? С помощью UIButton вы можете настроить действие и передать идентификатор отправителя, из которого вы можете легко получить доступ к своим тегам и вытащить данные из вашего массива.

  UIButton *button = [[UIImageView alloc] initWithFrame:CGRectMake(10, i*100 + i*15, 300, 100)];
button.backgroundColor = [UIColor blueColor];
button.tag = i;
[button addTarget:self action:@selector(touchDown:) controlEvent:UIControlEventTouchDown]; 

И внутри метода touchDown: вам просто нужно отправить отправителя в UIButton, чтобы получить доступ к тегу

- (void)touchDown:(id)sender    
{
    UIButton* button = (UIButton*)sender;
    switch(button.tag)
    {
        case TAG1:
          break;
        //etc
    }    
}

ИЛИ проверьте это

UIScrollView *myScroll = [[UIScrollView alloc] initWithFrame: CGRectMake (0,100,200,30)];
NSMutableArray = *images = [NSMutableArray alloc] initWithObjects: img1,img2,img3,nil];


for (int i=0; i<3; i++)
{
    // set `imageView` frame 
    UIImageView *imageV = [[UIImageView alloc]initWithFrame:yourFrame];
    [imageV setImage:[images objectAtIndex:i]];
    [imageV setUserInteractionEnabled:YES];
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:     self action:@selector (getTag:)];
    [imageV addGestureRecognizer: singleTap];
    [myScroll addSubview:imageV];

}

установить тег на изображения по вашему желанию После того, как вы добавили все ImageView успешно, вы получите их щелчок следующим образом: -

-(void)getTag:(id)sender
{
     UIGestureRecognizer *recognizer = (UIGestureRecognizer*)sender;
     UIImageView *imageView = (UIImageView *)recognizer.view;

     if(imageView.image.tag==1)
     {
         [imageView setImage:[UIImage imageNamed:@"anyImage.png"]];
     }
}

Ответ 3

Предположим, у вас есть массив с отображаемыми объектами и UIImageView для отображения изображения, просто сделайте это при настройке представления с индексом i:

imageView.tag = kImageTag + i; 

где kImageTag - любая константa > 1, чтобы убедиться, что вы не получаете 0 в качестве тега.

Теперь, когда выбрано представление, вы можете просто проверить тег изображения.

Ответ 4

Я решил проблему и действительно благодаря всем, чтобы посмотреть на мою проблему.

Ответ 5

Лучший способ достичь желаемого - добавить UITapGesture к своему изображению:

let tapgesture = UITapGestureRecognizer(target: self, action: Selector("openImage:"))
tapgesture.numberOfTapsRequired = 1
//if you're using a collectionView or tableview add this code inside cellForItemAtIndexPath
cell.Img.addGestureRecognizer(tapgesture)
//otherwise
myImage..addGestureRecognizer(tapgesture)

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

func openImage(sender: UITapGestureRecognizer) 
{
     let point = sender.view
     let mainCell = point?.superview
     let main = mainCell?.superview
     let cell: myViewCell = main as! myViewCell
     let indexPath = collectionView.indexPathForCell(cell)
}

Вы можете увеличить или уменьшить супервизор в зависимости от уровня иерархии. Начните с одного супервизора и продолжайте увеличиваться, пока не получите indexPath

Ответ 6

Для тех, кто использует storyboards и swift:

  • Изменить тег каждого UIView или UIImageView в IB (построитель интерфейсов) ex:

    view1.tag = 1
    view2.tag = 2
    view3.tag = 3
    ...
    
  • Еще в раскадровке добавьте UITapGestureRecognizer для каждого UIView, который вы разместили в виде раскадровки (view1, view2, view3...):

снимок экрана UITapGestureRecognizers (9 на картинке)

  1. Напишите свою функцию в файле Swift:

//код в быстром файле:

    @IBAction func viewTapped(sender: AnyObject) {
            // You can write anything here. I'm guessing you need something with 'enable/disable' function, and the best call is the CustomView which you create from File > New file
            print("tapped view is view with tag: \(sender.view!!.tag)")
        }
  1. Подключите каждый TapGestureRecognizer к той же функции, которую вы указали в родительском файле UIViewController swift:

Установленное соединение между UITapGestureRecognizer и func, написанное в swift файле

  1. Готово.