一個擴大按鈕點擊范圍的小技巧,在不改變frame的前提下,可通過以下方法實現:
關聯是指把兩個對象相互關聯起來,使得其中的一個對象作為另外一個對象的一部分。
源對象,關鍵字,關聯的對象和一個關聯策略。 ■ 關鍵字是一個void類型的指針。每一個關聯的關鍵字必須是唯一的。通常都是會采用靜態變量來作為關鍵字。 ■ 關聯策略表明了相關的對象是通過賦值,保留引用還是復制的方式進行關聯的;還有這種關聯是原子的還是非原子的。這里的關聯策略和聲明屬性時的很類似。這種關聯策略是通過使用預先定義好的常量來表示的。
使用函數objc_removeAssociatedObjects可以斷開所有關聯。通常情況下不建議使用這個函數,因為他會斷開所有關聯。只有在需要把對象恢復到“原始狀態”的時候才會使用這個函數。
下面是例子:
@implementation UIButton(extend)
static char topNameKey;
static char rightNameKey;
static char bottomNameKey;
static char leftNameKey;
-(void)setEnlargeEdgeWithTop:(CGFloat)top right:(CGFloat)right bottom:(CGFloat)bottom left:(CGFloat)left{
objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(CGRect)enlargedRect{
NSNumber *topEdge =objc_getAssociatedObject(self, &topNameKey);
NSNumber *rightEdge =objc_getAssociatedObject(self, &rightNameKey);
NSNumber *bottomEdge =objc_getAssociatedObject(self, &bottomNameKey);
NSNumber *leftEdge =objc_getAssociatedObject(self, &leftNameKey);
CGRect rect =CGRectZero;
if(topEdge && rightEdge && bottomEdge && leftEdge){
rect = CGRectMake(self.bounds.origin.x-leftEdge.floatValue,self.bounds.origin.y-topEdge.floatValue,self.bounds.size.width+leftEdge.floatValue+rightEdge.floatValue,self.bounds.size.height+topEdge.floatValue+bottomEdge.floatValue);
}else{
rect = self.bounds;
}
return rect;
}
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
CGRect rect = [selfenlargedRect];
if(CGRectEqualToRect(rect,self.bounds)){
return [superhitTest:point withEvent:event];
}
returnCGRectContainsPoint(rect, point) ?self : nil;
}
新聞熱點
疑難解答