SORU
30 NİSAN 2009, PERŞEMBE


UİButton: vuruş alanını varsayılan isabet alanından daha büyük Yapma

Bir soru UİButton ve hit alanı ile ilgili var. Interface builder İnfo Karanlık düğmesini kullanıyorum, ama isabet alan bazı insanların parmakları için yeterince büyük değil, çok zorlanıyorum.

Bir şekilde İnfoButton grafik boyutunu değiştirmeden bir düğmeye programlı veya Interface Builder ya da vuruş alanını artırmak için var mı?

CEVAP
25 EKİM 2012, PERŞEMBE


Bir arka plan görüntüsü kullanıyorum beri, bu çözümlerin hiçbiri benim için çalıştı. İşte bazı eğlenceli objective-c büyü yapar ve en az bir kod ile çözüm bir damla sunan bir çözüm.

İlk vuruş testi geçersiz kılar ve aynı zamanda isabet sınama çerçevesi genişleyen bir özellik ekler UIButton için bir kategori ekleyin.

UİButton Uzantıları.h

@interface UIButton (Extensions)

@property(nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;

@end

UİButton Uzantıları.m

#import "UIButton Extensions.h"
#import <objc/runtime.h>

@implementation UIButton (Extensions)

@dynamic hitTestEdgeInsets;

static const NSString *KEY_HIT_TEST_EDGE_INSETS = @"HitTestEdgeInsets";

-(void)setHitTestEdgeInsets:(UIEdgeInsets)hitTestEdgeInsets {
    NSValue *value = [NSValue value:&hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];
    objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(UIEdgeInsets)hitTestEdgeInsets {
    NSValue *value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS);
    if(value) {
        UIEdgeInsets edgeInsets; [value getValue:&edgeInsets]; return edgeInsets;
    }else {
        return UIEdgeInsetsZero;
    }
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if(UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) ||       !self.enabled || self.hidden) {
        return [super pointInside:point withEvent:event];
    }

    CGRect relativeFrame = self.bounds;
    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);

    return CGRectContainsPoint(hitFrame, point);
}

@end

Bu sınıf eklendikten sonra, tüm yapmanız gereken kenarına düğme parçalar ayarlanır. Eğer vuruş alanını daha büyük yapmak istiyorsanız, negatif sayılar kullanmanız gerekir böylece parçalar eklemek için seçtim unutmayın.

    [button setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -10)];

Not: kategorisi (#import "UIButton Extensions.h") sınıflar da almayı Unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunnyboxx

    bunnyboxx

    17 NİSAN 2008
  • David Wills

    David Wills

    31 Aralık 2007
  • ThreadBanger

    ThreadBanger

    2 Mart 2007