iOS關(guān)于超出視圖部分按鈕響應(yīng)

有個(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

搞定!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容