Пользовательские 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 просто растягивает изображение.)
Ответы
Ответ 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;