Подтвердить что ты не робот

Пользовательские UIBarButtonItems из UIButtons с настраиваемыми изображениями - возможно ли увеличить целевые объекты крана?

Я делаю 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 просто растягивает изображение.)

4b9b3361

Ответ 1

Небольшие изменения в вашем коде будут делать вещи

Необходимые изменения:

  • Я предполагаю, что размер 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 в соответствии с вашими требованиями.
Этот код работал у меня.

Ответ 2

Вы можете изменить свойство ширины UIBarButtonItem

backBarButtonItem.width = x;

К сожалению, вы не можете изменить высоту, потому что нет свойства высоты.

Однако вы можете использовать pass UIBarButtonItem a 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];

Если ваше изображение выглядит растянутым, убедитесь, что вы поддерживаете одинаковое соотношение сторон! Или убедитесь, что изображение точно такого же размера.

Ответ 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

Предположим, что событие touch не срабатывает, нам нужно, чтобы он отображал его, чтобы вызвать кнопку, поэтому в 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)];

Надеюсь, что это поможет

Ответ 4

Когда вы вызываете initWithCustomView, UIBarButtonItem делегирует обработку событий в пользовательское представление, которое в вашем случае является UIButton. В свою очередь, UIButton получает свои границы от изображения, и в качестве фонового изображения ожидается растяжение, чтобы заполнить новые границы по мере необходимости.

Вместо этого установите свойства image и imageInsets непосредственно в UIBarButtonItem. Эти свойства объявляются в родительском классе, UIBarItem. Вы также можете установить свои ландшафтные варианты.

Ответ 5

mmm... для чего вам нужно достичь - это не растяжение изображения - есть простой способ:

1) используйте Gimp или Photoshop и создайте прозрачный слой под своим изображением, чтобы он соответствовал желаемому размеру.

2) сливаются и создают изображения сетчатки и не сетчатки.

3) обновите свой код, чтобы он отражал новый размер изображения.

4) назначьте изображения, а затем запустите свой код.

Таким образом, ваше исходное изображение не будет растягиваться, потому что границы будут учитывать его прозрачную часть.

Кроме того, вы можете сделать это все программно, но я сомневаюсь, что это хорошая идея, если вы не планируете погружаться в UIGraphics по другим причинам.

Ответ 6

Смените рамку кнопки на большую и измените свою линию

[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

в

[backButton setImage:backButtonImage forState:UIControlStateNormal];

Ответ 7

Просто используйте

[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];

Ответ 8

вы можете просто установить вставки кромок на кнопке.

поэтому установите рамку кнопки на большее, чем изображение, затем установите наклейку на кнопку.

чтобы увеличить вашу ширину на 10 пикселей с каждой стороны, что-то вроде этого должно работать

backButton.frame = CGRectMake(0,0,28,37);
backButton.imageEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);

Ответ 9

Увеличьте рамки UIButton (до нужного размера)

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

Если вы хотите увидеть изображение для полной кнопки, напишите следующий метод

      [backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

Если вы хотите увидеть фактический размер изображения (не беспокойтесь, размер вашего муфты - только размер вашей кнопки)

      [backButton setImage:backButtonImage forState:UIControlStateNormal];

И наконец

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

Надеюсь, это поможет вам!

Ответ 10

Вам нужно изменить три строки кода и надеяться, что они будут работать.

1) Измените ширину задней панели в соответствии с вашими потребностями.

2) Установите backButton Image вместо backButton BackgroundImage

[backButton setImage:backButtonImage forState:UIControlStateNormal];

3) Также установите backButton contentHorizontalAlignment

backButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;