TouchMoved с UIButton xcode 4.4 iOS 5.1.1

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

Я хочу переместить объекты моего обзора, чтобы следовать горизонтальным слайдам пальца (переход к предыдущей или следующей странице)

Для этого я использую методы TouchesBegan, TouchesMoved и TouchesEnded.

Он отлично работает, когда касания начинаются на фоне просмотра, но не работает, когда касания начинаются с uibuttons.

Чтобы решить эту проблему, я создал подклассы uibuttons, которые я хочу разрешить жестом, и он работал нормально, когда я был на xCode 3.x и iOS 4.x.

Сегодня я только что установил OSX Moutain Lion и начал работать над xCode 4.4 и iOS 5.1.1 (iPAD). И вот я с тем же приложением, которое работало нормально и больше не работает.

Вот мой подкласс UIButton:

//  myUIButton.h

#import <UIKit/UIKit.h>

@interface myUIButton : UIButton

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

@end


//  myUIButton.m

#import "myUIButton.h"

@implementation myUIButton

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"uibutton touches began");
    [self.nextResponder touchesBegan:touches withEvent:event];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"uibutton touches moved");
    [self.nextResponder touchesMoved:touches withEvent:event];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"uibutton touches ended");
    [self.nextResponder touchesEnded:touches withEvent:event];
}

@end

Вот методы моего основного класса:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"view touches began");
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"view touches moved");
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"view touches ended");
}

Когда мое прикосновение началось к UIButton, я получаю каждый NSLog из подкласса, но main touchesMoved выполняется только один раз. (кажется, что self.nextResponder работает только один раз)

Изменилось ли что-то, из-за чего он не работает на xcode 4.4 или iOS 5.1.1?

Когда я впервые попытался это сделать (на xcode 3.x и iOS 4.x), я нашел решение здесь: Есть ли способ передавать касания на iPhone?

Но это уже не работает ...

Не могли бы вы помочь мне?

Большое спасибо.

РЕДАКТИРОВАТЬ: проблема та же, что и при использовании [super touch ...] вместо или в большем количестве [self.nextResponder touch ...]


person Little Gecko    schedule 03.08.2012    source источник
comment
ты решил эту проблему? Я столкнулся с аналогичной проблемой. У меня есть Fingerpaint, и он отлично работает на iOS 6, но на моем новом iPad iOS7 он не рендерится, пока не будет touchEnded. Только малая часть красится после прикосновений начал   -  person Dietmar Schwarz Webers    schedule 17.11.2013
comment
Извините, что ответил так поздно, но письмо отправлено в ящик для спама. Я решил свою проблему, но точно не помню, как именно, поэтому я написал то, что считаю правильным.   -  person Little Gecko    schedule 16.01.2014


Ответы (1)


Я решил проблему некоторое время назад и не помню, как, но в моих файлах есть отличия, поэтому я напишу здесь новую версию, которая работает.

//  myUIButton.h
#import <Foundation/Foundation.h>

@interface myUIButton : UIButton {
}

@end

.

//  myUIButton.m

#import "myUIButton.h"

@implementation myUIButton

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"uibutton touches began");
    [super touchesBegan:touches withEvent:event];
    [self.nextResponder touchesBegan:touches withEvent:event];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"uibutton touches moved");
    [super touchesMoved:touches withEvent:event];
    [self.nextResponder touchesMoved:touches withEvent:event];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"uibutton touches ended");
    [super touchesEnded:touches withEvent:event];
    [self.nextResponder touchesEnded:touches withEvent:event];
}

@end

В каждом представлении, в котором мне нужно это поведение, я помещаю средство распознавания жестов панорамирования в файл .xib, который я связываю с действием panRecognizer: определенным в файле. M

// file.m

@synthesize slide_origin_x;

-(IBAction)panRecognizer:(UIPanGestureRecognizer *)recognizer {
    // Recording movement
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        self.slide_origin_x = [NSNumber numberWithFloat:recognizer.view.center.x];
    }

    // Choose an action
    else if (recognizer.state == UIGestureRecognizerStateEnded) {
        int to_launch_action = 100; // Action choosen after 100 pixels
        int touch_move = [self.slide_origin_x intValue] - recognizer.view.center.x;
        if (touch_move > (0 + to_launch_action)) {
            /*
             * What happens if the view slide to the left (eg : go_to_next)
             */
        } else if (touch_move < (0 - to_launch_action)) {
            /*
             * What happens if the view slide to the right (eg : go_to_previous)
             */
        }
        // The view goes back to normal
        recognizer.view.center = CGPointMake([self.slide_origin_x intValue], recognizer.view.center.y);
    }

    // The view is moved
    else {
        CGPoint translation = [recognizer translationInView:self.view];
        recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                             recognizer.view.center.y);
        [recognizer setTranslation:CGPointMake(0,0) inView:self.view];
    }
}

К вашему сведению: это работает также на XCode5 и SDK6.1

person Little Gecko    schedule 16.01.2014