按鈕在執行frame動畫的時候怎么響應觸發事件?
代碼中效果(請注意,我並沒有點擊到按鈕,而是點擊到按鈕的終點frame值處):
對應的代碼:
// // ViewController.m // TapButton // // Created by YouXianMing on 14/12/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 初始化按鈕 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; button.backgroundColor = [UIColor redColor]; [button addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; // 執行動畫 [UIView animateWithDuration:10.f delay:0 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction animations:^{ button.frame = CGRectMake(0, 468, 100, 100); } completion:^(BOOL finished) { }]; } /** * 按鈕事件 * * @param button 按鈕事件 */ - (void)buttonEvent:(UIButton *)button { NSLog(@"YouXianMing"); } @end
修改過后的效果:
源碼:
// // ViewController.m // TapButton // // Created by YouXianMing on 14/12/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "ChildView.h" @interface ViewController () { ChildView *tmpView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 初始化按鈕 tmpView = [[ChildView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; tmpView.backgroundColor = [UIColor redColor]; tmpView.userInteractionEnabled = NO; // 讓self.view獲取點擊事件(穿透自身) [self.view addSubview:tmpView]; // 執行動畫 [UIView animateWithDuration:10.f delay:0 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction animations:^{ tmpView.frame = CGRectMake(0, 468, 100, 100); } completion:^(BOOL finished) { }]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 獲取點擊點 CGPoint point = [[touches anyObject] locationInView:self.view]; // 獲取tmpView的layer當前的位置 CGPoint presentationPosition = [[tmpView.layer presentationLayer] position]; // 判斷位置,讓tmpView接受點擊事件 if (point.x > presentationPosition.x - 50 && point.x < presentationPosition.x + 50 && point.y > presentationPosition.y - 50 && point.y < presentationPosition.y + 50) { [tmpView touchesBegan:touches withEvent:event]; } } @end
ChildView.h 與 ChildView.m
// // ChildView.h // TapButton // // Created by YouXianMing on 14/12/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @interface ChildView : UIView @end
// // ChildView.m // TapButton // // Created by YouXianMing on 14/12/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ChildView.h" @implementation ChildView - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"獲取點擊事件"); } @end
關鍵性的兩步: