2

我在 PaintCode 中创建了一个自定义按钮。PC 有很多关于创建图形的文档,但没有使用它们。

我的方法有效,但我会遇到一些问题......我走的是子类化我放在故事板中的 UIButton 的路线。然后我为它分配了我的自定义按钮的类,我们称之为customButton. 使用此方法,您可以连接 IB 中的操作,并且突出显示状态由touchesBegantouchesEnded方法与切换突出显示视图的变量串联处理,但问题是,突出显示状态永远不会在快速触摸时显示。

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 绘制的按钮?这个问题是它并不总是显示突出显示的状态,并且感觉有点hacky。肯定有更好的方法吗?

4

2 回答 2

6

解决此问题的最佳方法是覆盖highlighted. UIControl它是按钮状态的最准确指示器。我正在使用 swift,但转换为 ObjC 很简单:

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

现在,不要传入_isPressed,只需传入highlighted(或[self highlighted])。

为了完整起见:

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

似乎这里有一篇关于这个的好文章


完整的代码示例:

注意我更进一步,如果按钮未启用或突出显示,则突出显示。

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)
    }

}
于 2014-11-13T17:41:54.277 回答
2

谢谢,@Mazyod。这真的很有帮助。

这是一个基于@Mazyod 回答的 Swift 3 项目:

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)
    }
}

演示

于 2015-05-15T00:16:16.513 回答