有個(gè)需求,就是需要超出視圖部分上面的按鈕能夠響應(yīng)點(diǎn)擊事件,大概如圖所示:

Paste_Image.png
說一下大概情況,就是有一個(gè)容器v1(紅色),上面又一個(gè)元素v2(綠色)。v2的上面又有一個(gè)元素v3(藍(lán)色),v3有一部分超出了v2的邊界,并且超出部分上面還存在一個(gè)按鈕(右下角)?,F(xiàn)在要求點(diǎn)擊右下角按鈕,能夠讓按鈕響應(yīng)事件。
繪制界面的代碼如下:
do {
View1 *v = [View1 new];
self.v1 = v;
v.backgroundColor = [UIColor redColor];
[self.view addSubview:v];
[v makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(300);
make.height.equalTo(300);
make.top.equalTo(self.view);
make.centerX.equalTo(self.view);
}];
} while (0);
do {
View2 *v = [View2 new];
self.v2 = v;
v.backgroundColor = [UIColor greenColor];
[_v1 addSubview:v];
[v makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(100);
make.height.equalTo(100);
make.top.equalTo(self.view);
make.centerX.equalTo(self.view);
}];
} while (0);
do {
View3 *v = [View3 new];
self.v3 = v;
v.backgroundColor = [UIColor blueColor];
[_v2 addSubview:v];
[v makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(100);
make.height.equalTo(100);
make.centerX.equalTo(self.view).offset(50);
make.bottom.equalTo(_v2).offset(20);
}];
} while (0);
UIButton *btn = [UIButton new];
[btn setBackgroundImage:[WJCommonUtils imageFromColor:RGBCOLOR(200, 100, 100)] forState:UIControlStateNormal];
[btn setBackgroundImage:[WJCommonUtils imageFromColor:RGBCOLOR(100, 100, 200)] forState:UIControlStateHighlighted];
[_v3 addSubview:btn];
[btn makeConstraints:^(MASConstraintMaker *make) {
make.width.height.equalTo(20);
make.right.equalTo(_v3);
make.bottom.equalTo(_v3);
}];
我們知道了iOS下的事件傳遞機(jī)制,因此可以通過重寫view的hitTest方法來控制事件傳遞。因?yàn)榭梢赃@樣改:
重寫v1的hittest方法:
#import "View1.h"
#import "choose.h"
@implementation View1
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"View1 hitTest start ");
UIView *item = [super hitTest:point withEvent:event];
if (item == self) {
NSArray *array = [choose choose:@"View3"];
if (array.count>0) {
UIView *v = (UIView *)array.lastObject;
CGPoint p = [self convertPoint:point toView: v];
item = [v hitTest:p withEvent:event];
}
}
NSLog(@"View1 hitTest - %@",item);
return item;
}
@end
搞定!