UIView子类不响应触摸

时间:2011-06-07 08:35:44

标签: objective-c cocoa-touch

我正在制作一个iPad项目,其中一个名为“Car”的类(这是一个与视图控制器不同的文件)应该被拖到主视图周围。

我按照我在Apple示例中看到的那样设置了类,当我运行应用程序时,我能够查看我的图像,但是就像我的课程没有响应我的触摸事件而我无法解决问题。

这是我的班级代码: Car.h

#import <UIKit/UIKit.h>


@interface Car : UIView {

    UIImageView *firstPieceView;
    CGPoint startTouchPosition;

}

-(void)animateFirstTouchAtPoint:(CGPoint)touchPoint forView:(UIImageView *)theView;
-(void)animateView:(UIView *)theView toPosition:(CGPoint) thePosition;
-(void)dispatchFirstTouchAtPoint:(CGPoint)touchPoint forEvent:(UIEvent *)event;
-(void)dispatchTouchEvent:(UIView *)theView toPosition:(CGPoint)position;
-(void)dispatchTouchEndEvent:(UIView *)theView toPosition:(CGPoint)position;

@property (nonatomic, retain) IBOutlet UIImageView *firstPieceView;

@end

这是我的其他类代码:Car.m

#import "Car.h"

    @implementation Car

    @synthesize firstPieceView;

    #define GROW_ANIMATION_DURATION_SECONDS 0.15    // Determines how fast a piece size grows when it is moved.
    #define SHRINK_ANIMATION_DURATION_SECONDS 0.15  // Determines how fast a piece size shrinks when a piece stops moving.


    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {

        // Enumerate through all the touch objects.
        NSUInteger touchCount = 0;
        for (UITouch *touch in touches) {
            // Send to the dispatch method, which will make sure the appropriate subview is acted upon
            [self dispatchFirstTouchAtPoint:[touch locationInView:self] forEvent:nil];
            touchCount++;  
        }   
    }

    // Checks to see which view, or views, the point is in and then calls a method to perform the opening animation,
    // which  makes the piece slightly larger, as if it is being picked up by the user.
    -(void)dispatchFirstTouchAtPoint:(CGPoint)touchPoint forEvent:(UIEvent *)event
    {
        if (CGRectContainsPoint([firstPieceView frame], touchPoint)) {
            [self animateFirstTouchAtPoint:touchPoint forView:firstPieceView];
        }   
    }

    // Handles the continuation of a touch.
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {  

        NSUInteger touchCount = 0;
        // Enumerates through all touch objects
        for (UITouch *touch in touches) {
            // Send to the dispatch method, which will make sure the appropriate subview is acted upon
            [self dispatchTouchEvent:[touch view] toPosition:[touch locationInView:self]];
            touchCount++;
        }
    }

    // Checks to see which view, or views, the point is in and then sets the center of each moved view to the new postion.
    // If views are directly on top of each other, they move together.
    -(void)dispatchTouchEvent:(UIView *)theView toPosition:(CGPoint)position
    {
        // Check to see which view, or views,  the point is in and then move to that position.
        if (CGRectContainsPoint([firstPieceView frame], position)) {
            firstPieceView.center = position;
        } 
    }

    // Handles the end of a touch event.
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // Enumerates through all touch object
        for (UITouch *touch in touches) {
            // Sends to the dispatch method, which will make sure the appropriate subview is acted upon
            [self dispatchTouchEndEvent:[touch view] toPosition:[touch locationInView:self]];
        }
    }

    // Checks to see which view, or views,  the point is in and then calls a method to perform the closing animation,
    // which is to return the piece to its original size, as if it is being put down by the user.
    -(void)dispatchTouchEndEvent:(UIView *)theView toPosition:(CGPoint)position
    {   
        // Check to see which view, or views,  the point is in and then animate to that position.
        if (CGRectContainsPoint([firstPieceView frame], position)) {
            [self animateView:firstPieceView toPosition: position];
        } 
    }

    -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // Enumerates through all touch object
        for (UITouch *touch in touches) {
            // Sends to the dispatch method, which will make sure the appropriate subview is acted upon
            [self dispatchTouchEndEvent:[touch view] toPosition:[touch locationInView:self]];
        }
    }

    #pragma mark -
    #pragma mark === Animating subviews ===
    #pragma mark

    // Scales up a view slightly which makes the piece slightly larger, as if it is being picked up by the user.
    -(void)animateFirstTouchAtPoint:(CGPoint)touchPoint forView:(UIImageView *)theView 
    {
        // Pulse the view by scaling up, then move the view to under the finger.
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:GROW_ANIMATION_DURATION_SECONDS];
        theView.transform = CGAffineTransformMakeScale(1.2, 1.2);
        [UIView commitAnimations];
    }

    // Scales down the view and moves it to the new position. 
    -(void)animateView:(UIView *)theView toPosition:(CGPoint)thePosition
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:SHRINK_ANIMATION_DURATION_SECONDS];
        // Set the center to the final postion
        theView.center = thePosition;
        // Set the transform back to the identity, thus undoing the previous scaling effect.
        theView.transform = CGAffineTransformIdentity;
        [UIView commitAnimations];  
    }



    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {

            UIImage *img = [ UIImage imageNamed: @"CyanSquare.png" ];
            firstPieceView = [[UIImageView alloc] initWithImage: img];
            //[img release];
            [super addSubview:firstPieceView];
            [firstPieceView release];

        }
        return self;
    }

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
    }
    */

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

    @end

这是我的视图控制器代码:(ParkingviewController.h)

#import <UIKit/UIKit.h>
#import "Car.h"


@interface ParkingViewController : UIViewController {

}

@end

最后但并非最不重要的是ParkingViewController.m

#import "ParkingViewController.h"

@implementation ParkingViewController

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

- (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.
}

#pragma mark - View lifecycle


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


    Car *car1 = [[Car alloc] init];
    [self.view addSubview:car1];
    [car1 release];
    [super viewDidLoad];
}


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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

@end

如果我发布了所有代码,请原谅我,但我想清楚我项目的各个方面,以便任何人都可以清楚地了解整个情况。

1 个答案:

答案 0 :(得分:1)

您需要为正在为要处理的触摸创建的Car对象设置一个框架。您可以看到图像,因为默认情况下,视图的clipsToBounds属性设置为NO