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

  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013
  • Paul Schroder

    Paul Schrode

    30 Kasım 2007