Размах жестов в приложении Multiview - PullRequest
1 голос
/ 06 июля 2011

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

Вот mainViewController.h

 #import <UIKit/UIKit.h>

@interface mainViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>
{
        NSArray *listData;
}
@property (nonatomic, retain) NSArray *listData;
@end

Теперь mainViewController.m

#import "mainViewController.h"

@implementation mainViewController
@synthesize listData;


- (void)viewDidLoad {
    NSArray *array =[[NSArray alloc] initWithObjects:@"Apple",@"Boy",@"Cat", nil];
    self.listData = array;
    [array release];
    [super viewDidLoad];
}


- (void)dealloc
{
    [listData release];
    [super dealloc];
}


#pragma mark - View lifecycle

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    return [self.listData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             SimpleTableIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault
                 reuseIdentifier:SimpleTableIdentifier] autorelease];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    //cell.textLabel.font = [UIFont boldSystemFontOfSize:50];
    return cell;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSUInteger row = [indexPath row];
    NSString *rowValue = [listData objectAtIndex:row];
    if([rowValue isEqualToString:@"Apple"])
    {
     cell.backgroundColor = [UIColor redColor];
    }
    else
        if([rowValue isEqualToString:@"Boy"])
                   cell.backgroundColor= [UIColor yellowColor];



}

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSUInteger row = [indexPath row];
    NSString *rowValue = [listData objectAtIndex:row];
    if([rowValue isEqualToString:@"Apple"])
       {
           mainViewController* flashView=[[mainViewController alloc] initWithNibName:@"fl" bundle:[NSBundle mainBundle]];
           [self.view addSubview:flashView.view];


       }

    //[tableView deselectRowAtIndexPath:indexPath animated:YES];
}


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

- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 110;
}


@end

Я добавил класс UIViewSubController с файлом xib с именем "fl".

In fl.h:

#define kMinimumLength 5
#define kMaxVariance 1
#import <UIKit/UIKit.h>
#import "mainViewController.h"

@protocol flDelegate;

@interface fl : UIViewController <UIGestureRecognizerDelegate>
{

    CGPoint gestureStartPoint;
    id <flDelegate> delegate;

}
@property CGPoint gestureStartPoint;
@property (nonatomic,retain) id <flDelegate> delegate;
@end

@protocol flDelegate 

-(IBAction)flDidFinish:(fl *)controller;

@end

А теперь в fl.m:

#import "fl.h"

@implementation fl

@synthesize delegate;
@synthesize gestureStartPoint;


- (void)dealloc
{
    [super dealloc];

}

#pragma mark - View lifecycle

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch =[touches anyObject];
    gestureStartPoint =[touch locationInView:self.view];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch =[touches anyObject];
    CGPoint CurrentPosition =[touch locationInView:self.view];
    if(CurrentPosition.x >= kMinimumLength)
    { 
        NSLog(@"Go");
    }
}

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

Здесь все работает, но не обнаруживает пролистывания и не печатает Go.

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

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

        if (touch.phase == UITouchPhaseBegan) {
//          NSLog(@"TOUCH BEGAN");
            _initialView = touchView;
            startTouchPosition1 = [touch locationInView:self];
            startTouchTime = touch.timestamp;

            if ([allTouches count] > 1) {
                startTouchPosition2 = [[[allTouches allObjects] objectAtIndex:1] locationInView:self];
                previousTouchPosition1 = startTouchPosition1;
                previousTouchPosition2 = startTouchPosition2;
            }
        }

        if (touch.phase == UITouchPhaseMoved) {
//          NSLog(@"TOUCH MOVED");
            if ([allTouches count] > 1) {
                CGPoint currentTouchPosition1 = [[[allTouches allObjects] objectAtIndex:0] locationInView:self];
                CGPoint currentTouchPosition2 = [[[allTouches allObjects] objectAtIndex:1] locationInView:self];

                CGFloat currentFingerDistance = CGPointDist(currentTouchPosition1, currentTouchPosition2);
                CGFloat previousFingerDistance = CGPointDist(previousTouchPosition1, previousTouchPosition2);
                if (fabs(currentFingerDistance - previousFingerDistance) > ZOOM_DRAG_MIN) {
                    NSNumber* movedDistance = [NSNumber numberWithFloat:currentFingerDistance - previousFingerDistance];
                    if (currentFingerDistance > previousFingerDistance) {
                        NSLog(@"zoom in");
                        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ZOOM_IN object:movedDistance];
                    } else {
                        NSLog(@"zoom out");
                        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ZOOM_OUT object:movedDistance];
                    }
                }
            }
        }

        if (touch.phase == UITouchPhaseEnded) {
            CGPoint currentTouchPosition = [touch locationInView:self];

            // Check if it's a swipe
            if (fabsf(startTouchPosition1.x - currentTouchPosition.x) >= SWIPE_DRAG_HORIZ_MIN &&
//              fabsf(startTouchPosition1.y - currentTouchPosition.y) <= SWIPE_DRAG_VERT_MAX &&
                fabsf(startTouchPosition1.x - currentTouchPosition.x) > fabsf(startTouchPosition1.y - currentTouchPosition.y) &&
                touch.timestamp - startTouchTime < 0.7
                ) {
                // It appears to be a swipe.
                if (startTouchPosition1.x < currentTouchPosition.x) {
                    NSLog(@"swipe right");
                    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SWIPE_RIGHT object:touch];
                } else {
                    NSLog(@"swipe left");
                    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SWIPE_LEFT object:touch];
                }
            }
            startTouchPosition1 = CGPointMake(-1, -1);
            _initialView = nil;
        }

РЕДАКТИРОВАТЬ: о вашем коде ...

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

    if(CurrentPosition.x >= kMinimumLength)

вы сравниваете позицию (CurrentPosition.x) с расстоянием (kMinimumLength).Это не очень важно.Вам нужно сохранить позицию последнего касания, а затем рассчитать расстояние между последним касанием и текущим касанием и сравнить это расстояние с kMinimumLenght.

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

0 голосов
/ 06 июля 2011

Вы обязательно должны взглянуть на UISwipeGestureRecognizer s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...