按鈕在執行frame動畫的時候怎么響應觸發事件?


按鈕在執行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

關鍵性的兩步:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM