Подтвердить что ты не робот

IOS Обнаружение касания и касания UIView

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

-(void)viewDidLoad
{        
    UITapGestureRecognizer *dismissGestureRecognition = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDismissDoubleTap:)];
    dismissGestureRecognition.numberOfTapsRequired = 1;
    [sectionDismissDoubleView addGestureRecognizer:dismissGestureRecognition];

    UITapGestureRecognizer *dismissGestureDownRecognition = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissGestureDownRecognition:)];
    dismissGestureRecognition.numberOfTouchesRequired = 1;
    [sectionDismissDoubleView addGestureRecognizer:dismissGestureDownRecognition];
}

- (void)handleDismissDoubleTap:(UIGestureRecognizer*)tap {
    SettingsDismissDoubleViewController *settingsDouble = [[SettingsDismissDoubleViewController alloc] initWithNibName:@"SettingsDismissDoubleViewController" bundle:nil];
    [self.navigationController pushViewController:settingsDouble animated:YES];
}

- (void)dismissGestureDownRecognition:(UIGestureRecognizer*)tap {
    NSLog(@"Down");
}
4b9b3361

Ответ 1

Признак распознавания жестов, вероятно, слишком велико для того, что вы хотите. Вероятно, вы просто хотите использовать комбинацию -touchesBegan:withEvent: и -touchesEnded:withEvent:.

Это недостаток, но он должен дать вам представление о том, что вы хотите сделать.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.touchDown = YES;
    self.backgroundColor = [UIColor redColor];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Triggered when touch is released
    if (self.isTouchDown) {
        self.backgroundColor = [UIColor whiteColor];
        self.touchDown = NO;
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Triggered if touch leaves view
    if (self.isTouchDown) {
        self.backgroundColor = [UIColor whiteColor];
        self.touchDown = NO;
    }
}

Этот код должен идти в пользовательский подкласс UIView, который вы создаете. Затем используйте этот тип пользовательского вида вместо UIView, и вы получите сенсорную обработку.

Ответ 2

введите описание изображения здесь

Этот метод не требует подклассификации. Вы просто добавляете UILongPressGestureRecognizer в представление и устанавливаете значение minimumPressDuration равным нулю. Затем вы проверяете состояние, когда вызываются события жестов, чтобы узнать, начинается или заканчивается событие касания.

Вот весь код проекта для приведенного выше примера.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add "long" press gesture recognizer
        let tap = UILongPressGestureRecognizer(target: self, action: #selector(tapHandler))
        tap.minimumPressDuration = 0
        myView.addGestureRecognizer(tap)
    }

    // called by gesture recognizer
    func tapHandler(gesture: UITapGestureRecognizer) {

        // handle touch down and touch up events separately
        if gesture.state == .Began {
            myView.backgroundColor = UIColor.darkGrayColor()
        } else if  gesture.state == .Ended {
            myView.backgroundColor = UIColor.lightGrayColor()
        }
    }
}

Благодаря этому ответу за идею.

Ответ 3

В каждом подклассе UIControl (UIButton и т.д.) вы можете использовать его для подписки на определенный набор UIControlEvent:

addTarget:action:forControlEvents

Вы должны добавить цель с помощью соответствующего селектора для UIControlEventTouchDown и другого целевого/селектора для события UIControlEventTouchUpInside.

Ссылка UIControl

Ответ 4

Во-первых, вашим селектором handleDismissDoubleTap:, я бы предположил, что вы ищете двойное нажатие, чтобы уволить. Чтобы достичь этого, вы должны делать: dismissGestureRecognition.numberOfTapsRequired = 2;

Во-вторых, если при прикосновении вы имеете в виду длительное нажатие (или "нажмите и удерживайте" ), вы должны использовать UILongPressGestureRecognizer вместо UITapGestureRecognizer.

Ответ 5

Благодаря Ответ Холли я построил класс удобства ButtonView.

Изменить: поскольку этот ответ говорит, UILongPressGestureRecognizer реагирует довольно быстро, поэтому я обновил свой класс.

Использование:

let btn = ButtonView()
btn.onNormal = { btn.backgroundColor = .clearColor() }
btn.onPressed = { btn.backgroundColor = .blueColor() }
btn.onReleased = yourAction // Function to be called

Класс:

/** View that can be pressed like a button */

import UIKit

class ButtonView : UIView {

    /* Called when the view goes to normal state (set desired appearance) */
    var onNormal = {}
    /* Called when the view goes to pressed state (set desired appearance) */
    var onPressed = {}
    /* Called when the view is released (perform desired action) */
    var onReleased = {}

    override init(frame: CGRect)
    {
        super.init(frame: frame)

        let recognizer = UILongPressGestureRecognizer(target: self, action: Selector("touched:"))
        recognizer.delegate = self
        recognizer.minimumPressDuration = 0.0
        addGestureRecognizer(recognizer)
        userInteractionEnabled = true

        onNormal()
    }

    func touched(sender: UILongPressGestureRecognizer)
    {
        if sender.state == .Began {
            onPressed(self)
        } else if sender.state == .Ended {
            onNormal(self)
            onReleased()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}