2014-09-12 3 views
2

Я создал пользовательскую кнопку в PaintCode. ПК имеет много документации по созданию графики, но не использует их.Лучший способ подключить кнопку PaintCode?

Мой метод работает, но у него есть проблемы, с которыми я доберусь ... Я пошел по пути подкласса UIButton, который я разместил в своем раскадровке. Затем я назначил ему класс моей пользовательской кнопки, мы назовем ее customButton. Используя этот метод, вы можете подключить действие в IB, а выделенное состояние обрабатывается методами touchesBegan и touchesEnded в сочетании с переменной, которая переключает выделенный вид, но проблема в том, что выделенное состояние никогда не отображается при быстрых касаниях.

customButton.m:

@interface customButton() 

@property BOOL isPressed; 

@end 

@implementation customButton 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

-(void) awakeFromNib { 
    [super awakeFromNib]; 
    _buttonText = @"Post"; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [StyleKit drawCustomButtonWithFrame:rect pressed:_isPressed buttonText:_buttonText]; 
} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    _isPressed = YES; 
    [self setNeedsDisplay]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self sendActionsForControlEvents:UIControlEventTouchUpInside]; 
    _isPressed = NO; 
    [self setNeedsDisplay]; 
} 

Мой вопрос: есть ли лучший способ реализации кнопки нарисованный PaintCode? Проблема с этим заключается в том, что он не всегда отображает выделенное состояние и чувствует себя довольно хаки. Неужели есть лучший способ?

+1

Вы отправляете подправить Внутри событий, но вы не проверяя, что прикосновение внутри кнопки, когда она заканчивается. – Fogmeister

+0

Кроме того, вам, вероятно, будет лучше использовать UIButton и изображение. – Fogmeister

+0

@Fogmeister - использовать кнопку PaintCode (как четко указано в вопросе) - чья графика рисуется с кодом и независима от разрешения. – inorganik

ответ

6

Лучший способ сделать это - переопределить highlighted недвижимость в UIControl. Это самый точный индикатор состояния кнопки. Я использую быстрые, но это тривиально перевести ObjC:

class VectorizedButton: UIButton { 
    override var highlighted: Bool { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 
} 

Теперь, вместо передачи в _isPressed, просто передать в highlighted (или [self highlighted]).

Для полноты картины:

- (void)setHighlighted:(BOOL)isHigh 
{ 
    [super setHighlighted:isHigh]; 
    [self setNeedsDisplay]; 
} 

Кажется, есть good article about this here.


Полный пример кода:

Примечание Я взял его на шаг дальше, и выделить, если кнопка не включена или выделена.

class VectorizedButton: UIButton { 

    override var highlighted: Bool { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    // MARK: - Init & Dealloc 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     backgroundColor = UIColor.clearColor() 
    } 

    // MARK: - Private methods 

    private var shouldHighlight: Bool { 
     return highlighted || !enabled 
    } 

    // MARK: - Public methods 

    override func drawRect(rect: CGRect) { 
     StyleKit.drawMyButton(frame: bounds, highlighted: shouldHighlight) 
    } 

} 
+0

Вы предлагаете называть переопределенный метод 'setHighlighted' от' touchhesBegan' и 'touchesEnded'? Просто хочу быть ясным. – inorganik

+0

@inorganik Нет. Все дело в том, чтобы UIKit обрабатывал события касания и устанавливал для нас свойство 'highlight'. В самом деле, UIKit устанавливает выделение 'true' при касании, и возвращается к' false' на касании. После этого мы просто запускаем перерисовку ('setNeedsDisplay') и передаем' highlight'. – Mazyod

2

Спасибо, @Mazyod. Это действительно помогает.

Вот проект Swift 3 на основе @ ответ Mazyod в:

https://github.com/backslash-f/paint-code-ui-button

(Проект PaintCode прилагается там).

import UIKit 

@IBDesignable class CustomUIButton: UIButton { 

    // MARK: Properties 

    override var isHighlighted: Bool { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    override var isSelected: Bool { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    override var isEnabled: Bool { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    // MARK: Lifecycle 

    override func draw(_ rect: CGRect) { 
     StyleKit.drawWatchButton(frame: rect, highlighted: isHighlighted) 
    } 
} 

demo

Смежные вопросы