28

UIButtonプログラムで作成しました

togglebutton = [UIButton buttonWithType:UIButtonTypeCustom];
togglebutton.frame = CGRectMake(42, 15, 80, 21);
[togglebutton addTarget:self action:@selector(toggleview)   
forControlEvents:UIControlEventTouchUpInside];
[togglebutton setImage:[UIImage imageNamed:@"squ.png"] forState:UIControlStateNormal];
[buttonView addSubview:togglebutton];

ここに画像の説明を入力

上の画像の右のボタンのように見えます。ここでの要件は、このボタンの選択領域が uibutton イメージよりも大きくなければならないことです。ユーザーが特定のボタンの近くの領域に触れることで、簡単にボタンをクリックできるようにします。

[togglebutton setImageEdgeInsets: UIEdgeInsetsMake( 0, -30, 0, -25)];

を設定しようとしましたimage insetが、 になりimage irregularます。この問題を見てください。

4

9 に答える 9

47

これは、ボタンの を設定することで実現できますcontentEdgeInsets。次に例を示します。

toggleButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); //set as you require 
于 2013-06-22T09:47:20.363 に答える
18

スイフト用

UIView クラスの func 'pointInside' をオーバーライドして、クリック可能な領域を拡張できます。

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    // padding : local variable of your custom UIView, CGFloat
    // you can change clickable area dynamically by setting this value.

    let newBound = CGRect(
        x: self.bounds.origin.x - padding,
        y: self.bounds.origin.y - padding,
        width: self.bounds.width + 2 * padding,
        height: self.bounds.height + 2 * padding
    )
    return CGRectContainsPoint(newBound, point)
}

このように使って、

class MyButton: UIButton {
    var padding = CGFloat(0) // default value

    //func pointInside at here!!
}

ボタンを初期化するときに、カスタム パディングを設定します。

func initButton() {
    let button = MyButton(frame: CGRect(x: 100, y: 100, width: 30, height: 30))
    button.padding = 10 // any value you want
    view.addSubview(button)
}

次に、ボタンがフレーム内にあります(x:100、y:100、幅:30、高さ:30)

ボタンのクリック可能な領域は、(x: 90、y: 90、幅: 50、高さ: 50) のフレーム内にある可能性があります。

**クリックできる領域が見た目よりも大きいため、他のビューとの重なりを確認してください。

Swift 3 の更新

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    let padding = CGFloat(10)
    let extendedBounds = bounds.insetBy(dx: -padding, dy: -padding)
    return extendedBounds.contains(point)
}
于 2015-12-29T05:51:29.357 に答える
3

xcode 9 では、次のことができます。

xcode 9 スクリーンショット

つまり、画像のオフセットとコンテンツのオフセットを補正して、画像が中央に配置されるようにする必要があります。

于 2017-12-07T15:15:26.977 に答える
2

以下のコードは私の問題を解決します.これは非常に基本的な方法です.これを試してください:

    button.contentEdgeInsets = UIEdgeInsetsMake(15, 20, 10, 10);  //Change x,y,width,height as per your requirement.
于 2015-12-05T11:58:56.240 に答える
1

目的 C の場合

このカスタム UIButton クラスを作成し、ボタンに割り当てます。次に、viewController からこれらのプロパティ値を設定します。

//This is .h file
     #import <UIKit/UIKit.h>
        @interface CustomButton : UIButton
        @property (nonatomic) CGFloat leftArea;
        @property (nonatomic) CGFloat rightArea;
        @property (nonatomic) CGFloat topArea;
        @property (nonatomic) CGFloat bottomArea;
        @end



        //.m file is following
        #import "CustomButton.h
        @implementation CustomButton

        -(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
        {
            CGRect newArea = CGRectMake(self.bounds.origin.x - _leftArea, self.bounds.origin.y - _topArea, self.bounds.size.width + _leftArea + _rightArea, self.bounds.size.height + _bottomArea + _topArea);

            return CGRectContainsPoint(newArea, point);
        }
        @end
于 2017-11-12T07:21:04.243 に答える