0

私は と を持ってUIButtontitleLabelますbackgroundImage。強調表示された状態のボタンのサイズを変更したい。このサイズ変更はtitleLabelとに影響するはずbackgroundImageですが、ボタンのヒット領域を変更したくありません。

現在、私はこのようにしようとしています。ほとんど機能しますが、ヒット領域にも影響します。

- (void)setHighlighted:(BOOL)highlighted
{
    if ( highlighted && !self.highlighted )
    {
        self.transform = CGAffineTransformMakeScale(scaleFactorOnTouch, scaleFactorOnTouch);
    }
    else if ( !highlighted && self.highlighted )
    {
        self.transform = CGAffineTransformMakeScale(1.0, 1.0);
    }
    [super setHighlighted:highlighted];
}

これにより、ボタンの内側に触れて (100 ピクセル拡張された) ヒット エリアの外側にドラッグすると、拡張されたヒット エリアのエッジの周りをドラッグすると、この揺れ/震えが発生します。ウィグルは、hitArea がハイライトされた状態とハイライトされていない状態の間で絶えず変化しているためです。

self.layer.transform プロパティも変更してみましたが、これもヒット範囲が変わってしまいます。

可能であれば、強調表示された状態に別の backgroundImage を設定することは避けたいと思います。

4

1 に答える 1

2

お察しのとおりsetHighlighted:、ボタンの変換を変更するためにオーバーライドすると、一種の悪循環が発生します。だから、それをしないでください!backgroundRectForBounds:代わりに、次のようにオーバーライドします。

- (CGRect)backgroundRectForBounds:(CGRect)bounds {
    CGRect result = [super backgroundRectForBounds:bounds];
    if (self.highlighted)
        result = CGRectInset(result, -3, -3);
    return result;
}

強調表示中にボタンの描画サイズを拡大しますが、拡大された描画clipsToBoundsはNOであるためのみ表示されます。境界は同じままで、境界内でしかタッチできないため、タッチ処理は影響を受けません。

これにより、問題の背景画像部分が解決されます。どうしてもタイトルのサイズも変更したい場合は、変換を変更し続ける必要があると思います。ただし、代わりにタイトルのフォント (サイズ) を変更する方が侵略的ではありませんが、それが目的にかなう場合はそう思います。

于 2013-04-08T15:21:13.453 に答える