2011-01-07 3 views
4

Приложение, которое я создаю, имеет множество пользовательских UIButtons, лежащих поверх довольно точно выложенных изображений. Buttonish, управляет изображениями и ярлыками, и что у вас есть, но с явным пользовательским стилем UIButton, сидящим поверх него, чтобы обращаться с краном.Выделение пользовательского UIButton

Мой клиент вчера говорит: «Я хочу, чтобы это было подчеркнуто, когда вы касаетесь его». Не обращайте внимания на то, что он сразу же подталкивает новый просмотр uinavigationcontroller ... он не моргнул, и поэтому он смущен. Oy.

Вот что я сделал для его решения. Мне это не нравится, но это то, что я сделал:

Я подклассифицировал UIButton (назвав его FlashingUIButton).

По какой-то причине я не мог просто настроить его с фоновым изображением в режиме управления. Казалось, что оно никогда не попадало в состояние «подчеркнуто». Не знаю, почему это так.

Так вместо этого я написал:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self setBackgroundImage:[UIImage imageNamed:@"grey_screen"] forState:UIControlStateNormal]; 
    [self performSelector:@selector(resetImage) withObject:nil afterDelay:0.2]; 
    [super touchesBegan:touches withEvent:event]; 
} 

-(void)resetImage 
{ 
    [self setBackgroundImage:nil forState:UIControlStateNormal]; 
} 

Это счастливо лежит мой grey_screen.png (30% непрозрачный черный ящик) на кнопку, когда он постучал и заменяет его счастливой пустоту .2 секунду позже.

Это прекрасно, но это означает, что мне нужно пройти через все мои многочисленные наконечники и изменить все мои кнопки с UIButtons на FlashingUIButtons. Это еще не конец света, но я действительно надеялся обратиться к этому как к категории UIButton, и поразил всех птиц одним камнем.

Любые предложения относительно лучшего подхода, чем этот?

ответ

4

Вы можете перехватить прикосновения события с жест распознаватель, а затем программно добавить распознаватель ко всему вашему uibuttons. Например:

// 
// HighlighterGestureRecognizer.h 
// Copyright 2011 PathwaySP. All rights reserved. 
// 

#import <Foundation/Foundation.h> 


@interface HighlightGestureRecognizer : UIGestureRecognizer { 
    id *beganButton; 
} 

@property(nonatomic, assign) id *beganButton; 

@end 

и реализации:

// 
// HighlightGestureRecognizer.m 
// Copyright 2011 PathwaySP. All rights reserved. 
// 

#import "HighlightGestureRecognizer.h" 


@implementation HighlightGestureRecognizer 

@synthesize beganButton; 

-(id) init{ 
    if (self = [super init]) 
    { 
     self.cancelsTouchesInView = NO; 
    } 
    return self; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.beganButton = [[[event allTouches] anyObject] view]; 
    if ([beganButton isKindOfClass: [UIButton class]]) { 
     [beganButton setBackgroundImage:[UIImage imageNamed:@"grey_screen"] forState:UIControlStateNormal]; 
     [self performSelector:@selector(resetImage) withObject:nil afterDelay:0.2]; 

    } 
} 

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

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

} 

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

- (void)reset 
{ 
} 

- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event 
{ 
} 

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer 
{ 
    return NO; 
} 

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer 
{ 
    return NO; 
} 

- (void)resetImage 
{ 
    [beganButton setBackgroundImage: nil forState:UIControlStateNormal]; 
} 

@end 

Хм. Я не тестировал этот код, поэтому, если он не работает, не судите меня, просто комментируйте, и мы это рассмотрим. Я просто написал это очень быстро для справки. Даже если это не сработает, логика все равно должна звучать.

редактировать:

Забыл добавить, как вы бы добавить жест распознаватель к кнопке будет выглядеть примерно так:

HighlighterGestureRecognizer * tapHighlighter = [[HighlighterGestureRecognizer alloc] init]; 

[myButton addGestureRecognizer:tapHighlighter]; 
[tapHighlighter release]; 

Так в основном вы объявляющего его, инициализации и затем добавив его. После этого вы захотите выпустить его, так как addGestureRecognizer сохраняет его.

+0

Вы могли бы поставить (UIButton *) перед beganButton перед использованием его методы, как setBackgroundImage, только потому, что в реализации, я объявил его в качестве идентификатора. Я не уверен, будет ли это работать без этого. Другой альтернативой было бы объявить его как UIView, а не id, так как вы знаете, что это, по крайней мере, всегда будет UIView. В любом случае, вы можете поиграть с ним. – Omar

2

У вас есть adjustsImageWhenHighlighted = YES на ваших пуговицах? По умолчанию YES, но, возможно, вы изменили его в xib. Это «Выделена Настройка изображения» флажок в инспекторах атрибутов:

IB Highlight Button

0

У меня была такая же проблема после подкласса UIButton (Swift 2). Подкласса Функция «drawRect» НЕ вызывается, когда пользователь прикасается к UIButton (даже если в раскадровке отмечена галочка «Highlighted Adjusts Image»).Это может быть связано с тем, что это пользовательский UIButton.

В любом случае, это просто обрабатывать, переопределяя события «touchhesBegan» и «touchesEnded». Больше можно было бы сделать для обработки всех состояний кнопки (например, отключено). Но вот код.

Swift 2:

import Foundation 
import UIKit 

@IBDesignable 

class ppButton: UIButton { 
    override func drawRect(rect: CGRect) { 
     if self.state != UIControlState.Highlighted { 
      //SKit is another class containing a function to draw the custom button 
      SKit.drawPpButton(0, width: rect.width-2, height: rect.height-2) 
     } else { 
      //SKit is another class containing a function to draw the custom button 
      SKit.drawPpButton(0, width: rect.width-20, height: rect.height-20) 
     } 
    } 
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     super.touchesBegan(touches, withEvent: event) 
     self.setNeedsDisplay() 
    } 
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     super.touchesEnded(touches, withEvent: event) 
     self.setNeedsDisplay() 
    } 
} 
Смежные вопросы