-1

iPad アプリのラピッド プロトタイプ デモの助けが必要です。

いくつかのグラフィック要素を含む大きな背景画像があります。次に、このビューにカスタム UIButton を作成しました。残念ながら、そのボタンのヒット テスト領域を増やす必要があるため、ユーザーは、そのグラフィカルな背景要素に触れることも、その詳細のすぐ隣に配置されているボタンを押すことと同じ機能を持っていると考える必要があります。

hittest:withEvent メソッドをオーバーライドすると、ボタンが強調表示されますが、残念ながらそのターゲット/セレクターは UIControlEventTouchUpInside に対して呼び出されません。

それを機能させる方法はありますか?助けてくれてありがとう

更新: UIControl クラス リファレンス内で、「return self」の直前にこのように含めた「sendActionsForControlEvents」メソッドを見つけました。

    [self sendActionsForControlEvents:UIControlEventTouchUpInside];

これでタッチは認識されますが、「Hittest」ログが 2 回呼び出されます。2回呼び出すだけです。それを行う方法があれば、私は大丈夫です:)

更新 2:

これがサンプルチャートです。お役に立てば幸いです。

@implementation HotSpotButton
@synthesize data = _data;  
- (id)initWithDictionary:(HotSpotDataObject*)hotspotData
{        
    self.data = hotspotData;

    UIImage* img = loadImageWithoutCaching(@"infospot.png");     
    CGRect frame = CGRectMake(hotspotData.posX, hotspotData.posY, img.size.width, img.size.height);

    self = [super initWithFrame:frame];
    if (self) {

        [self setBackgroundColor:[UIColor darkGrayColor]];  //clearColor
        [self setAlpha:1];
        [self setBackgroundImage:img forState:UIControlStateNormal];
        [self setAdjustsImageWhenHighlighted:YES];
        [self setShowsTouchWhenHighlighted:YES];    

        // Animate the hotspot itself ==================================
         CABasicAnimation *scale =[CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
        // some pusling 
        [self.layer addAnimation:scale forKey:@"animateScale"];  
    }
    return self;
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    int errorMargin = 30;
    CGRect largerFrame = CGRectMake(0 - errorMargin, 0 - errorMargin, self.frame.size.width + errorMargin + 1024, self.frame.size.height + errorMargin);

    if ((CGRectContainsPoint(largerFrame, point)) == 1){
        NSLog(@"HITTEST");

        [self sendActionsForControlEvents:UIControlEventTouchUpInside];        
        return self;
    }
    else{
        NSLog(@"Outside");
        return nil;
    }

}
@end
4

3 に答える 3

2

それはずっと簡単です!!!

ボタンの画像よりもはるかに大きなフレームを作成しUIButton、ボタンの画像を配置したい場所に配置できます。

[someButton setFrame:CGRectMake(0, -9, self.view.frame.size.width+9, self.view.frame.size.height)];
//set image instead of this comment
someButton.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
someButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;

...例えば。

画像を特定の場所に配置したい場合は、UIControl をサブクラス化し、必要な画像を必要な場所にサブビューとして追加できます。簡単。

これで、hitTest メソッドはもう必要ないと思います...

于 2012-09-03T18:17:41.707 に答える
1

私があなたを正しく理解していれば。touchUpInside エリアを増減したいと思います。インサイドからアウトサイドに変わるポイントは?

UISlider のサム領域でこれを行いました。ここで私の質問と回答を見てくださいtouchUpInside が touchUpOutside に変わるポイントを取得して変更し ます UIButton のタッチ メソッドをオーバーライドすることで実現されるため、UIButton をサブクラス化する必要があります。

touchesEnded メソッドで座標をプロットすると、ボタンの周りに大きなボックスが作成されることがわかるので、必要に応じて座標を変更するだけです。

于 2012-09-03T18:04:25.920 に答える
0

このコードの「自己」がビューを参照していると思われるため、コードが2回呼び出されたと思いますか?

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

以下を使用する必要があります。

[self.myButton sendActionsForControlEvents:UIControlEventTouchUpInside];
于 2012-09-03T18:14:23.400 に答える