Выделение пользовательского UIButton - PullRequest
4 голосов
/ 07 января 2011

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

Мой клиент вчера сказал: «Я хочу, чтобы это выделилось, когда вы нажмете на него». Не берите в голову, что это немедленно выдвигает новое представление контроллера uinavigation ... это не мигало, и поэтому он смущен. 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 секунды позже.

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

Есть предложения по лучшему подходу, чем этот?

Ответы [ 3 ]

4 голосов
/ 07 января 2011

Вы можете перехватить события касания с помощью распознавателя жестов, а затем программно добавить распознаватель ко всем вашим 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

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

edit:

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

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

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

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

2 голосов
/ 07 января 2011

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

IB Highlight Button

0 голосов
/ 14 мая 2016

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

В любом случае, с ним просто работать, переопределяя события "touchesBegan" и "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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...