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");
}
Ответы
Ответ 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")
}
}