2013-10-26 5 views
27

У меня проблема с определением того, как обнаружить UIView, который был затронут, и UIView. Когда это коснется, я хочу, чтобы UIView изменил свой цвет фона. Когда это касается, я хотел бы, чтобы UIView выполнял определенные задачи. Я хотел бы знать, как я могу решить эту проблему.iOS Обнаружение касания и касания 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"); 
} 

ответ

34

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

1

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

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

6

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

addTarget:action:forControlEvents 

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

UIControl reference

+4

вопрос о uiview not uicontrol – trickster77777

0

Благодаря Holly's answer Я построил класс ButtonView.

Редактировать: Как это answer говорит, 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") 
    } 
} 
+0

Я, наконец, перешел на версию с использованием 'UIControl', которая не реагирует так быстро, но имеет и другие преимущества: вы можете перетащить« UIScrollView »ниже, если перетащите кнопку. Таким образом, просмотр прокрутки не застревает, когда вы пытаетесь перетащить его, и ваш жест перетаскивания начинается с того места, где находится кнопка. http://stackoverflow.com/a/40740616/1121497 –

27

enter image description here

Этот метод не требует подклассов ничего. Вы просто добавляете 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() 
     } 
    } 
} 

this answer Идея.

+2

Это предотвратит прокрутку родительского прокрутки от – xleon

+0

, безусловно лучший ответ (как обычно для Suragch!) – Fattie

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