MY_ iOS 按鈕超過父檢視範圍無法響應事件的處理方法
當按鈕超過了父檢視範圍,點選是沒有反應的。因為訊息的傳遞是從最下層的父檢視開始呼叫hittest方法。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
return view;
}
當存在view時才會傳遞對應的event,現在點選了父檢視以外的範圍,自然返回的是nil。所以當子檢視(比如按鈕btn)因為一些原因超出了父檢視範圍,就要重寫hittest方法,讓其返回對應的子檢視,來接收事件。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {
CGPoint tempoint = [btn convertPoint:point fromView:self];
if (CGRectContainsPoint(btn.bounds, tempoint))
{
view = btn;
}
}
return view;
}
超越點選事件
//
// UIButton+TapScope.m
// SuningSummer
//
// Created by snping on 14-8-15.
// Copyright (c) 2014年 Suning. All rights reserved.
//
#import "UIButton+TapScope.h"
#import <objc/runtime.h>
static void * kHitEdgeInsetsKey = &kHitEdgeInsetsKey;
@implementation UIButton (TapScope)
- (void)setHitEdgeInsets:(UIEdgeInsets)hitEdgeInsets
{
NSValue *value = [NSValue valueWithUIEdgeInsets:hitEdgeInsets];
objc_setAssociatedObject(self, kHitEdgeInsetsKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIEdgeInsets)hitEdgeInsets
{
NSValue * value = objc_getAssociatedObject(self, kHitEdgeInsetsKey);
if(value) {
return [value UIEdgeInsetsValue];
}
return UIEdgeInsetsZero;
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if (UIEdgeInsetsEqualToEdgeInsets(self.hitEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden) {
return [super pointInside:point withEvent:event];
}
CGRect hitFrame = UIEdgeInsetsInsetRect(self.bounds, self.hitEdgeInsets);
return CGRectContainsPoint(hitFrame, point);
}
相關文章
- iOS --按鈕 處理iOS
- 超出父檢視的子檢視如何響應點選事件事件
- iOS 11開發教程(二十一)iOS11應用檢視美化按鈕之實現按鈕的響應(1)iOS
- Gridview中新增按鈕響應事件View事件
- iOS探索:UI檢視之事件傳遞&檢視響應iOSUI事件
- iOS 11開發教程(二十二)iOS11應用檢視實現按鈕的響應(2)iOS
- iOS11開發教程(二十三)iOS11應用檢視實現按鈕的響應(3)iOS
- iOS 11開發教程(二十)iOS11應用檢視美化按鈕之設定按鈕的狀態iOS
- iOS 11開發教程(十九)iOS11應用檢視美化按鈕之設定按鈕的外觀iOS
- js實現的按鈕響應點選回車事件JS事件
- iOS中按鈕無法互動的5個原因iOS
- 檢視分割槽範圍
- android音視訊指南-響應媒體按鈕Android
- js為按鈕註冊點選事件處理函式JS事件函式
- [Android]關於Android子view超出父view無法響應點選事件AndroidView事件
- jQuery為動態新增的按鈕註冊事件處理函式jQuery事件函式
- iPhone6的【登入】按鈕最佳尺寸範圍是多少?iPhone
- iOS 11開發教程(十八)iOS11應用檢視之使用程式碼新增按鈕iOS
- vue 表單驗證按鈕事件交由父元件觸發Vue事件元件
- vue中在父元件點選按鈕觸發子元件的事件Vue元件事件
- 新增按鈕事件事件
- 淺談 iOS 事件的傳遞和響應過程iOS事件
- sqlplus 無響應 hang處理SQL
- MFC設定按下Enter鍵後響應指定的按鈕
- bw analyzer無法使用,開啟按鈕無用
- iOS 11開發教程(十七)iOS11應用檢視之使用按鈕接收使用者輸入iOS
- iOS 按鈕動畫iOS動畫
- windows10照片檢視器無法顯示圖片記憶體不足處理方法Windows記憶體
- 異形按鈕的點選區域處理
- 檢視EBS 資料庫等待事件及處理資料庫事件
- JQuery on()方法繫結動態元素的點選事件無響應的解決辦法jQuery事件
- 深入學習和理解Django檢視層:處理請求與響應Django
- 在MVVM模式中,按鈕Click事件的繫結方法MVVM模式事件
- [譯] 用 Flutter 實現 Facebook 的響應式按鈕Flutter
- 在 js 裡定義按鈕的響應函式JS函式
- [iOS]1 行程式碼快速整合按鈕延時處理(hook 實戰)iOS行程Hook
- iOS專案開發實戰——UIView的子檢視和父檢視iOSUIView
- Android處理按鈕重複點選Android