신속하게 프로그래밍 방식으로 UIView에서 제스처 탭을 호출하는 방법
UIView가 있고 탭 제스처를 추가했습니다.
let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
myView.addGesture(tap)
테스트 파일에서 프로그래밍 방식으로 호출하려고합니다.
sendActionForEvent
이 기능을 사용하고 있지만 작동하지 않습니다.
myView.sendActionForEvent(UIEvents.touchUpDown)
인식되지 않은 선택기가 인스턴스로 전송되었음을 보여줍니다.
이 문제를 어떻게 해결할 수 있습니까?
다음 UITapGestureRecognizer
과 같이 대상과 동작 으로 초기화해야합니다 .
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)
그런 다음 탭 이벤트가 발생할 때마다 호출되는 핸들러를 구현해야합니다.
@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
// handling code
}
따라서 탭 제스처 인식기 이벤트 핸들러를 호출하는 것은 메소드를 호출하는 것만 큼 쉽습니다.
handleTap()
Swift 3 솔루션을 찾고 계신 분
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
view.addGestureRecognizer(tap)
view.isUserInteractionEnabled = true
self.view.addSubview(view)
// function which is triggered when handleTap is called
func handleTap(_ sender: UITapGestureRecognizer) {
print("Hello World")
}
대한 스위프트 4 :
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
view.addGestureRecognizer(tap)
view.isUserInteractionEnabled = true
self.view.addSubview(view)
// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
print("Hello World")
}
Swift 4에서는 트리거 된 함수가 Objective-C에서 호출 가능함을 명시 적으로 표시해야하므로 handleTap 함수도 @objc를 추가해야합니다.
@Ali Beadle의 답변보기 : Swift 4 제스처 추가 : override vs @objc
참고 사항-뷰에서 상호 작용을 활성화하는 것을 잊지 마십시오.
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
// view.userInteractionEnabled = true
self.view.addSubview(view)
1 단계
@IBOutlet var viewTap: UIView!
2 단계
var tapGesture = UITapGestureRecognizer()
단계 : 3
override func viewDidLoad() {
super.viewDidLoad()
// TAP Gesture
tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.myviewTapped(_:)))
tapGesture.numberOfTapsRequired = 1
tapGesture.numberOfTouchesRequired = 1
viewTap.addGestureRecognizer(tapGesture)
viewTap.isUserInteractionEnabled = true
}
단계 : 4
func myviewTapped(_ sender: UITapGestureRecognizer) {
if self.viewTap.backgroundColor == UIColor.yellow {
self.viewTap.backgroundColor = UIColor.green
}else{
self.viewTap.backgroundColor = UIColor.yellow
}
}
산출
탭 제스처 구현
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen")
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)
탭이 인식되면이 기능을 호출합니다.
func touchHappen() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
self.view.endEditing(true)
}
스위프트 3 용 업데이트
let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchHappen(_:)))
view.addGestureRecognizer(tap)
view.userInteractionEnabled = true
func touchHappen(_ sender: UITapGestureRecognizer) {
print("Hello Museer")
}
스위프트 4
let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:)))
self.view.addGestureRecognizer(tap)
@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
이것이 스위프트 3에서 작동하는 방식입니다.
@IBOutlet var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap))
myView.addGestureRecognizer(tap)
}
func handleTap() {
print("tapped")
}
나는 Xcode 6.4에서 신속하게 작업했습니다. 아래를 참조하십시오.
var view1: UIView!
func assignTapToView1() {
let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap"))
// tap.delegate = self
view1.addGestureRecognizer(tap)
self.view .addSubview(view1)
...
}
func handleTap() {
print("tap working")
view1.removeFromSuperview()
// view1.alpha = 0.1
}
스위프트 4에 대한 완전한 답변
1 단계 :보기를위한 콘센트 만들기
@IBOutlet weak var rightViewOutlet: UIView!
2 단계 : 탭 제스처 정의
var tapGesture = UITapGestureRecognizer()
3 단계 : ObjC 함수 생성 (뷰를 탭할 때 호출)
@objc func rightViewTapped(_ recognizer: UIGestureRecognizer) {
print("Right button is tapped")
}
4 단계 : viewDidLoad () 내에 다음을 추가하십시오.
let rightTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.rightViewTapped(_:)))
rightViewOutlet.addGestureRecognizer(rightTap)
다음과 같이 대상과 동작으로 UITapGestureRecognizer를 초기화해야합니다.
let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)
그런 다음 탭 이벤트가 발생할 때마다 호출되는 핸들러를 구현해야합니다.
func handleTap(sender: UITapGestureRecognizer) {
// handling code
}
Objective C 코드가 아래에 표시되도록하려면
UITapGestureRecognizer *gesRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; // Declare the Gesture.
gesRecognizer.delegate = self;
[yourView addGestureRecognizer:gesRecognizer]; // Add Gesture to your view.
// Declare the Gesture Recognizer handler method.
- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer{
NSLog(@"Tapped");
}
또는 신속한 코드가 아래에 제공되기를 원합니다.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Add tap gesture recognizer to view
let tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
myView.addGestureRecognizer(tapGesture)
}
// this method is called when a tap is recognized
func handleTap(sender: UITapGestureRecognizer) {
print("tap")
}
}
let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:"))
frontView.addGestureRecognizer(tap)
// Make sure this is not private
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
print("tap working")
}
스위프트 4
먼저 UITapGestureRecognizer의 객체를 만듭니다.
var tapGesture = UITapGestureRecognizer()
두 번째 단계는 UITapGestureReconizer를 초기화하는 것입니다. 사용자 상호 작용을 활성화 한 다음 추가하십시오.
override func viewDidLoad() {
super.viewDidLoad()
tapGesture = UITapGestureRecognizer(target: self, action: #selector(YourViewController.myviewTapped(_:)))
infosView.isUserInteractionEnabled = true
infosView.addGestureRecognizer(tapGesture)
view.addSubview(infosView)
}
셋째, 방법을 만듭니다
@objc func myviewTapped(_ recognizer: UIGestureRecognizer) {
print("button is tapped")
}
Swift 2.2에서 Xcode 7.3.1을 개발했습니다. 아래를 참조하십시오.
func addTapGesture() {
let tap = UITapGestureRecognizer(target: self, action: #selector(MyViewController.handleTap))
tap.numberOfTapsRequired = 1
self.myView.addGestureRecognizer(tap)
}
func handleTap() {
// Your code here...
}
다음 확장을 시도하십시오
extension UIView {
func addTapGesture(action : @escaping ()->Void ){
let tap = MyTapGestureRecognizer(target: self , action: #selector(self.handleTap(_:)))
tap.action = action
tap.numberOfTapsRequired = 1
self.addGestureRecognizer(tap)
self.isUserInteractionEnabled = true
}
@objc func handleTap(_ sender: MyTapGestureRecognizer) {
sender.action!()
}
}
class MyTapGestureRecognizer: UITapGestureRecognizer {
var action : (()->Void)? = nil
}
그리고 그것을 사용하십시오 :
submitBtn.addTapGesture {
//your code
}
당신은 심지어 세포에 사용할 수 있습니다
cell.addTapGesture {
//your code
}
다음 빠른 코드를 사용해보십시오 (Xcode 6.3.1에서 테스트).
import UIKit
class KEUITapGesture150427 : UIViewController {
var _myTap: UITapGestureRecognizer?
var _myView: UIView?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.whiteColor();
_myTap = UITapGestureRecognizer(target: self
, action: Selector("_myHandleTap:"))
_myTap!.numberOfTapsRequired = 1
_myView = UIView(frame: CGRectMake(100, 200, 100, 100))
_myView!.backgroundColor=UIColor.blueColor()
_myView!.layer.cornerRadius = 20
_myView!.layer.borderWidth = 1
_myView!.addGestureRecognizer(_myTap!)
view.addSubview(_myView!)
}
func _myHandleTap(sender: UITapGestureRecognizer) {
if sender.state == .Ended {
println("_myHandleTap(sender.state == .Ended)")
sender.view!.backgroundColor
= UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
}
}
}
대상은 UIResponder의 하위 클래스 일 수 있습니다 (Xcode 6.3.1에서 테스트).
import UIKit
class MyTapTarget : UIResponder {
func _myHandleTap2(sender: UITapGestureRecognizer) {
if sender.state == .Ended {
println("_myHandleTap2(sender.state == .Ended)")
sender.view!.backgroundColor
= UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
}
}
}
class KEUITapGesture150427b : UIViewController {
var _myTap: UITapGestureRecognizer?
var _myView: UIView?
var _myTapTarget: MyTapTarget?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.whiteColor();
_myTapTarget = MyTapTarget()
_myTap = UITapGestureRecognizer(target: _myTapTarget!
, action: Selector("_myHandleTap2:"))
_myTap!.numberOfTapsRequired = 1
_myView = UIView(frame: CGRectMake(100, 200, 100, 100))
_myView!.backgroundColor=UIColor.blueColor()
_myView!.layer.cornerRadius = 20
_myView!.layer.borderWidth = 1
_myView!.addGestureRecognizer(_myTap!)
view.addSubview(_myView!)
}
}
나는 계속 문제를 일으키는 두 가지 점을 지정하고 싶었다.
- init에서 Gesture Recognizer를 만들어 let 속성에 저장했습니다. 분명히이 제스처 녹음을보기에 추가해도 작동하지 않습니다. 초기화하는 동안 제스처 인식기에 자기 객체가 전달 될 수 있습니다. 제대로 구성되지 않았습니다.
- 프레임이 0 인 뷰에 제스처 인식기를 추가해서는 안됩니다. 프레임이없는 모든 뷰를 만든 다음 자동 레이아웃을 사용하여 크기를 조정합니다. 자동 레이아웃 엔진으로 뷰의 크기를 조정 한 후에는 제스처 인식기를 추가해야합니다. 그래서 viewDidAppear에 제스처 인식기를 추가하면 작동합니다.
xCode 9.3, 스위프트 4.0
class BaseVC: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var iView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let clickUITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.onSelect(_:)))
clickUITapGestureRecognizer.delegate = self
iView?.addGestureRecognizer(tap)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return true
}
@IBAction func onSelect(_ sender: Any) {
}
}
myView의 UITapGestureRecognizer를 호출하는 대신 handleTap
함수를 직접 호출 할 수 있습니다 .
내부 뷰
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
self.imgMainAdView.isUserInteractionEnabled = true
self.imgMainAdView.addGestureRecognizer(tapGestureRecognizer)
//MARK: - Image Tap Method -
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
print("Tapped")
if let url = URL(string: self.strMAinAdvLink)
{
UIApplication.shared.open(url, options: [:])
}
}
전화 목적
@IBAction func btnCall1Action(_ sender: Any)
{
let text = self.strPhoneNumber1!
let test = String(text.filter { !" -()".contains($0) })
UIApplication.shared.openURL(NSURL(string: "tel://\(test)")! as URL)
}
메일 목적
MFMailComposeViewControllerDelegate
@IBAction func btnMailAction(_ sender: Any)
{
let strEmail = SAFESTRING(str: (self.dictEventDetails?.value(forKeyPath: "Email.value_text.email") as! String))
if !MFMailComposeViewController.canSendMail()
{
AppDelegate.sharedInstance().showAlertAction(strTitle: "OK", strMessage: "Mail services are not available") { (success) in
}
return
}
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = self
composeVC.setToRecipients([strEmail])
composeVC.setSubject("")
composeVC.setMessageBody("", isHTML: false)
self.present(composeVC, animated: true, completion: nil)
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
{
controller.dismiss(animated: true, completion: nil)
}
Swift 5 에서보기에 제스처를 추가하는 가장 간단한 방법은 다음과 같습니다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
addGestures()
}
// MARK: Add Gestures to target view
func addGestures()
{
// 1. Single Tap or Touch
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapGetstureDetected))
tapGesture.numberOfTapsRequired = 1
view.addGestureRecognizer(tapGesture)
//2. Double Tap
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapGestureDetected))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)
//3. Swipe
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeGetstureDetected))
view.addGestureRecognizer(swipeGesture)
//4. Pinch
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchGetstureDetected))
view.addGestureRecognizer(pinchGesture)
//5. Long Press
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressGetstureDetected))
view.addGestureRecognizer(longPressGesture)
//6. Pan
let panGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.panGestureDetected))
view.addGestureRecognizer(panGesture)
}
// MARK: Handle Gesture detection
@objc func swipeGetstureDetected() {
print("Swipe Gesture detected!!")
}
@objc func tapGetstureDetected() {
print("Touch/Tap Gesture detected!!")
}
@objc func pinchGetstureDetected() {
print("Pinch Gesture detected!!")
}
@objc func longPressGetstureDetected() {
print("Long Press Gesture detected!!")
}
@objc func doubleTapGestureDetected() {
print("Double Tap Gesture detected!!")
}
@objc func panGestureDetected()
{
print("Pan Gesture detected!!")
}
//MARK: Shake Gesture
override func becomeFirstResponder() -> Bool {
return true
}
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?){
if motion == .motionShake
{
print("Shake Gesture Detected")
}
}
}
Swift 5.1 세 가지보기의 예
1 단계 : -스토리 보드보기 추가 및 콘센트보기 추가
@IBOutlet var firstView: UIView!
@IBOutlet var secondView: UIView!
@IBOutlet var thirdView: UIView!
단계 : 2- > 스토리 보드보기 태그 추가
단계 : 3- > 제스처 추가
override func viewDidLoad() {
super.viewDidLoad()
firstView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
firstView.isUserInteractionEnabled = true
secondView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
secondView.isUserInteractionEnabled = true
thirdView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
thirdView.isUserInteractionEnabled = true
}
단계 : 4- >보기 선택
@objc func tap(_ gestureRecognizer: UITapGestureRecognizer) {
let tag = gestureRecognizer.view?.tag
switch tag! {
case 1 :
print("select first view")
case 2 :
print("select second view")
case 3 :
print("select third view")
default:
print("default")
}
}
'development' 카테고리의 다른 글
목록에서 여러 요소 삭제 (0) | 2020.06.22 |
---|---|
Java에서 http 응답 본문을 문자열로 어떻게 얻을 수 있습니까? (0) | 2020.06.22 |
Heroku '허가 거부 (공개 키) 치명적 : 원격 저장소에서 읽을 수 없음'문제 (0) | 2020.06.22 |
정규식에서 "\ d"는 숫자를 의미합니까? (0) | 2020.06.22 |
RVM은 기능이 아니며 'rvm use…'로 루비를 선택하면 작동하지 않습니다 (0) | 2020.06.22 |