Распознаватель жестов в UIScrollview - PullRequest
0 голосов
/ 22 марта 2011

У меня в поле зрения есть скроллер, и внутри него есть несколько изображений.

Я бы хотел перетащить эти изображения из моего скроллера и перетащить их в него.Я реализовал LongPressGestureRecognizer.

Я также хотел бы знать (по коду), какое изображение стало длинным.Я думал, что исправил этот последний с помощью CGRectContainsPoint.Однако мой код не реагирует на CGRectContainsPoint.Он все еще регистрирует «сбой».

- (void)viewDidLoad{

    //scroller properties
    scroller.contentSize = CGSizeMake(1300, 130);
    scroller.scrollEnabled = YES;
    scroller.directionalLockEnabled =YES;
    scroller.frame = CGRectMake(0, 874, 768, 130);

    UILongPressGestureRecognizer *longPress =
    [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];

    [image1 addGestureRecognizer:longPress];
    [image2 addGestureRecognizer:longPress];
    [image3 addGestureRecognizer:longPress];
    [longPress release];

}

-(void)longPressed:(UILongPressGestureRecognizer *)sender {


    CGPoint location = [sender locationInView:self.view];

    if(CGRectContainsPoint(image1.frame,  location)) {
        NSLog(@"image1 has been longpressed");
        // do something
    }

    if(CGRectContainsPoint(image2.frame,  location)) {
        NSLog(@"image2 has been longpressed");
        // do something
    }

    if(CGRectContainsPoint(image3.frame,  location)) {
        NSLog(@"image3 has been longpressed");
        // do something


    }

         else {
                 NSLog(@"fail");
}

Кто-нибудь получил опыт работы с LongPressGestureRecognizer и количество изображений, которые могут реагировать на эту функцию?


Мне удалось реализовать два распознавателя жестов.Таким образом, изображения в моем скроллере теперь можно перетаскивать.Однако это ограничивает себя внутри прокрутки.Я хотел бы иметь некоторую функцию, которая заботится о том, чтобы выводить изображения перед просмотром прокрутки, чтобы я мог перетаскивать свои изображения из моего просмотра прокрутки.

В своем методе viewDidLoad я реализовал

[scroller addSubview:image1];
[scroller addSubview:image2];
[scroller addSubview:image3];

[[self view] addSubview:scroller];

и в моем методе longPressed я реализовал

[image1 bringSubviewToFront:self.view];

У кого-нибудь есть хорошие советы?Они очень ценятся!

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Добавить скроллвью и создать один IBOutlet

Добавьте три изображения к вашему проекту, в этом ответе я использую имена image1.png, image2.png и image3.png

И, наконец, вот код

- (void) viewDidLoad{
        [super viewDidLoad];

        for (int i=1; i<=3; i++) {
            NSString *file = [NSString stringWithFormat:@"image%d.png", i];
            UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:file]];
            imageView.frame = CGRectMake(i * 200, 0, 200, 200);
            imageView.userInteractionEnabled = YES;
            imageView.tag = i;
                      
            UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer              alloc] initWithTarget:self action:@selector(longPress:)];
           
            [thumbView addGestureRecognizer:recognizer];
            [scrollView addSubview:thumbView];
        }
    }    

-(void)longPress: (UILongPressGestureRecognizer *)recognizer
{
        UIView *view  = recognizer.view;
        int index = view.tag;
        NSLog(@"image pressed : %i", índex);
}

При таком подходе вы сможете создать 3 изображения и добавить к ним распознаватель жестов с меньшим количеством кода и сообщить, что imageView был долгим нажатием

Но если вы хотите перетащить imageView, UILongPressGestureRecognizer не будет работать для вас, для этой задачи вы должны использовать UIPanGestureRecognizer

Если вы хотите перетащить imageView из scrollView, вы можете имитировать этот эффект Удаление / скрытие imageView от scrollView и добавление imageView с тем же изображением точно, где был imageView, который вы скрываете / удаляете в представление, которое вы хотите перетащить imageView

больше визуальный эффект, но работает

0 голосов
/ 22 марта 2011

Просто измените свой класс, как показано ниже:

 @implementation longGestureViewController

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView 
{
    UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];

    self.view = view;
    self.view.tag = 100;
    [view release];

    mImageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, 100.0, 120.0)];
    mImageView1.image = [UIImage imageNamed:@"tile07.png"];
    [self.view addSubview:mImageView1];
    mImageView1.userInteractionEnabled = YES;
    mImageView1.tag = 1;
    [mImageView1 release];

    mImageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(120.0, 10.0, 100.0, 120.0)];
    mImageView2.image = [UIImage imageNamed:@"tile08.png"];
    mImageView2.userInteractionEnabled = YES;
    mImageView2.tag = 2;
    [self.view addSubview:mImageView2];
    [mImageView2 release];

    mImageView3 = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 140.0, 100.0, 120.0)];
    mImageView3.image = [UIImage imageNamed:@"tile09.png"];
    mImageView3.tag = 3;
    mImageView3.userInteractionEnabled = YES;
    [self.view addSubview:mImageView3];
    [mImageView3 release];
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad 
{
    [super viewDidLoad];

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];

    [mImageView1 addGestureRecognizer:longPress];
    [longPress release];

    longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];

    [mImageView2 addGestureRecognizer:longPress];
    [longPress release];

    longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];

    [mImageView3 addGestureRecognizer:longPress];
    [longPress release];
}

-(void)longPressed:(UILongPressGestureRecognizer *)sender 
{
    CGPoint location = [sender locationInView:self.view];
    UIView *view = [self.view hitTest:location withEvent:UIEventTypeTouches];
    NSLog(@"%d", view.tag);
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc 
{
    [super dealloc];
}
...