16

私は次のように UIBarButtons を作成しています:

// Create "back" UIBarButtonItem
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, 28, 17);
[backButton addTarget:self action:@selector(backButtonTapped) forControlEvents:UIControlEventTouchUpInside];
backButton.showsTouchWhenHighlighted = YES;

UIImage *backButtonImage = [UIImage imageNamed:@"back-button.png"];
[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

[toolBarItems addObject:backBarButtonItem];

ただし、タップ ターゲットは小さいです。より正確には、カスタム イメージのサイズです。(これも小さいです。) タップ ターゲットのサイズを大きくする方法はありますか?

(注: UIButtons のフレーム プロパティを変更すると、画像が引き伸ばされるだけです。)

4

10 に答える 10

26

コードに小さな変更を加えるだけで問題が解決します

必要な変更:

  • backButtonImageのサイズが であると仮定し{28,17}、ボタン フレームをCGRectMake(0, 0, 48, 37)`に設定しています
  • を取り外してbackGroundImage使用setImage:
  • プロパティimageEdgeInsetsをに設定しますUIEdgeInsetsMake(10, 10, 10, 10)

コードは次のようになります。

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, 48, 37);
[backButton addTarget:self action:@selector(backButtonTapped) forControlEvents:UIControlEventTouchUpInside];
backButton.showsTouchWhenHighlighted = YES;

UIImage *backButtonImage = [UIImage imageNamed:@"back-button.png"];
[backButton setImage:backButtonImage forState:UIControlStateNormal];

backButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

[toolBarItems addObject:backBarButtonItem];

frameおよびの値は、imageEdgeInsets要件に応じて変更できます。
このコードは私のために働いた。

于 2013-05-17T07:17:16.377 に答える
5

UIBarButtonItemの width プロパティを変更できます

backBarButtonItem.width = x;

残念ながら、高さのプロパティがないため、高さを変更することはできません。

ただし、できることは、を使用して定義されたフレームで を渡すUIBarButtonItemことUIButtonですinitWithCustomView

例えば:

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *backButtonImage = [UIImage imageNamed:@"back-button.png"];

   [button setBackgroundImage:backButtonImage forState:UIControlStateNormal];

    button.frame = CGRectMake(0, 0, width, height);

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];

画像が引き伸ばされているように見える場合は、同じ縦横比を維持してください。または、画像が正確に同じサイズであることを確認してください。

于 2013-05-08T23:08:56.317 に答える
3

1) UIButton にカテゴリを追加する
2) カテゴリに新しいプロパティを
追加する 3) 戻るボタンを初期化するメソッドを追加する
4) オーバーライドする-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
5) toolBarItems をサブクラス化する

@implementation UIButton (yourButtonCategory)
@dynamic shouldHitTest; // boolean
@dynamic hitTestRect; // enlarge rect of the button
@dynamic buttonPressedInterval; // interval of press, sometimes its being called twice

-(id)initBackBtnAtPoint:(CGPoint)_point{
// we only need the origin of the button since the size and width are fixed so the image won't be stretched
    self = [self initWithFrame:CGRectMake(_point.x, _point.y, 28, 17)];   
    [self setBackgroundImage:[UIImage imageNamed:@"back-button.png"]forState:UIControlStateNormal];

    self.shouldHitTest = CGRectMake(self.frame.origin.x - 25, self.frame.origin.y-10, self.frame.size.width+25, self.frame.size.height+25); // this will be the enlarge frame of the button
    self.shouldHitTest = YES;
    return self;
}


-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
BOOL shouldReturn = [super pointInside:point withEvent:event];
NSSet *touches = [event allTouches];
BOOL shouldSendTouches = NO;

for (UITouch *touch in touches) {
    switch (touch.phase) {
        case UITouchPhaseBegan:
            shouldSendTouches = YES;
            break;
        default:
            shouldSendTouches = NO;
            break;
    }
}


if(self.shouldHitTest){

    double elapse = CFAbsoluteTimeGetCurrent();
    CGFloat totalElapse = elapse - self.buttonPressedInterval;
    if (totalElapse < .32) {
        return NO;
        // not the event we were interested in
    } else {
                    // use this call

        if(CGRectContainsPoint(self.hitTestRect, point)){
            if(shouldSendTouches){
                self.buttonPressedInterval = CFAbsoluteTimeGetCurrent();

                [self sendActionsForControlEvents:UIControlEventTouchUpInside];
            }

            return NO;
        }
    }

}

return shouldReturn;

}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject]; 
CGPoint touch_point = [touch locationInView:self];
[self pointInside:touch_point withEvent:event];
}

@end

タッチ イベントがトリガーされない場合、ボタンを呼び出すためにそのビューが必要なので、toolBarItems で次のようにします。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesBegan:touches withEvent:event];
    for(id subs in self.subviews){
        if([subs isKindOfClass:[UIButton class]]){
            [subs touchesBegan:touches withEvent:event];
        }
    }


}

それで終わりです。実際のボタンを拡大せずにフレームを拡大します。

次のようにボタンにイニシャルを付けるだけです。UIButton *btn = [[UIButton alloc]initBackBtnAtPoint:CGPointMake(0,0)];

それが役に立てば幸い

于 2013-05-16T05:41:03.080 に答える
1

を呼び出すinitWithCustomViewと、UIBarButtonItemイベント処理がカスタム ビューに委任されますUIButton。次に、UIButtonは画像から境界を取得し、背景画像として、必要に応じて新しい境界を埋めるために引き伸ばされることが期待されます。

代わりに、UIBarButtonItem でimageおよびプロパティを直接設定します。imageInsetsこれらのプロパティは、親クラスで宣言されていUIBarItemます。ランドスケープ バリアントを設定することもできます。

于 2013-05-11T05:40:06.280 に答える
1

使うだけ

[button setImage:backButtonImage forState:UIControlStateNormal];

それ以外の

[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

フレームを好きなように設定します。画像は中央に配置され、ボタンは指定されたフレームでタッチを受け取ります。

このようなもの:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(50, 50, 50, 50);
[button setImage:backButtonImage forState:UIControlStateNormal];
于 2013-05-17T14:17:41.753 に答える
1

3 行のコードを変更する必要があり、それが機能することを願っています。

1) 必要に応じて backButton の幅を変更します。

2) backButton のImage代わりに backButton を設定するBackgroundImage

[backButton setImage:backButtonImage forState:UIControlStateNormal];

3) backButton も設定するcontentHorizontalAlignment

backButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;
于 2013-05-17T06:30:05.923 に答える
1

ボタンフレームを大きく変更し、ラインを変更します

[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

に:

[backButton setImage:backButtonImage forState:UIControlStateNormal];
于 2013-05-16T10:47:18.090 に答える
0

UIButton フレームを増やします (必要なタップ サイズまで)

      button.frame = CGRectMake(0, 0, 56, 20);

完了ボタンの画像を見たい場合は以下のメソッドを書いてください

      [backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

画像を実際のサイズで表示したい場合 (タップ サイズはボタン サイズのみです)

      [backButton setImage:backButtonImage forState:UIControlStateNormal];

そして最後に

      UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

それがあなたを助けることを願っています!

于 2013-05-16T14:06:20.460 に答える
0

ボタンにエッジインセットを設定するだけでよいはずです。

ボタンのフレームを画像よりも大きく設定してから、ボタンのエッジ インセットを設定します。

したがって、幅を両側で 10 ピクセルずつ拡大するには、次のようなものが機能するはずです

backButton.frame = CGRectMake(0,0,28,37);
backButton.imageEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);
于 2013-05-08T23:08:39.240 に答える