2012-03-17

UISegmentedControlで同じインデックスのクリックを検知

UISegmentedControlのクリックを検知するには、通常、ValueChangedイベントでやりますが、このイベントは同じインデックスがクリックされた場合は呼ばれません。しかし、TouchUpInsideイベントや、TouchDownイベントをとろうとしても、これらが呼ばれません。

UISegmentedControlを継承したサブクラスをつくれば、UISegmentedControlのクリックを検知できます。次の例では、同じインデックスが選択された場合は、TouchDownイベントが発生するようにしてあります。


ClickableSegmentedControl.h
#import 

@interface ClickableSegmentedControl : UISegmentedControl
@end


ClickableSegmentedControl.m
#import "ClickableSegmentedControl.h"

@implementation ClickableSegmentedControl

- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex
{
    BOOL isSameIndex = (selectedSegmentIndex == self.selectedSegmentIndex);
    [super setSelectedSegmentIndex:selectedSegmentIndex];
    if (isSameIndex) {
        [self sendActionsForControlEvents:UIControlEventTouchDown];
    }
}
@end

しかし、このやり方では、iOS4ではクリックを検知できても、iOS5ではムリでした。iOS4とiOS5のどちらにも対応するには、touchesEnded:withEvent:をオーバーライドすればいいようです。次の例では、TouchUpInsideイベントを発生させています。注意しなければいけないのは、これだとインデックスが変更されたどうかにかかわらずイベントが発生してしまう点です。touchesEnded:withEvent: は、ValueChangedイベントの後で呼ばれるようなので、この点を考慮して適切にハンドリングする必要があります。

ClickableSegmentedControl.m
#import "ClickableSegmentedControl.h"

@implementation ClickableSegmentedControl

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    [self sendActionsForControlEvents:UIControlEventTouchUpInside];
}
@end

0 件のコメント: