UI에서 제스처 탭을 호출하는 방법 프로그래밍 방식으로 신속하게 보기
UI 보기가 있고 탭 제스처를 추가했습니다.
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
@objc func handleTap(_ sender: UITapGestureRecognizer) {
print("Hello World")
}
Swift 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는 제스처 추가: 오버라이드 vs @objc.
참고 사항 - 보기에서 상호 작용을 활성화하는 것을 잊지 마십시오.
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
// view.userInteractionEnabled = true
self.view.addSubview(view)
탭 제스처 구현
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)
}
Swift 3 +에 대한 업데이트
let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchHappen(_:)))
yourView.addGestureRecognizer(tap)
yourView.userInteractionEnabled = true
func touchHappen(_ sender: UITapGestureRecognizer) {
print("Hello Dear you are here")
}
단계: 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
}
}
산출량
스위프트 5.1 세 가지 보기에 대한 예제
단계:1 -> 스토리보드 뷰 추가 및 아웃렛 뷰 추가컨트롤러 UIV뷰
@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")
}
}
스위프트 4
let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:)))
self.view.addGestureRecognizer(tap)
@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}
Swift 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")
}
Swift 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)
저는 Xcode 6.4를 swift로 운동했습니다.아래를 참조하십시오.
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
}
목표 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");
}
아니면 아래에 swift code가 주어지기를 원하신다면,
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")
}
}
UITapGesture Recognizer는 다음과 같은 대상 및 작업을 사용하여 초기화해야 합니다.
let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)
그런 다음 탭 이벤트가 발생할 때마다 호출되는 핸들러를 구현해야 합니다.
func handleTap(sender: UITapGestureRecognizer) {
// handling code
}
Swift 5에서 View에 제스처를 추가하는 가장 간단한 방법은 다음과 같습니다.
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")
}
}
}
다음 확장을 시도합니다.
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
}
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()
두 번째 단계는 UITapGesture Reconizer를 초기화하는 것입니다.사용자 상호 작용을 활성화한 다음 추가합니다.
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...
}
나는 나에게 계속 문제를 일으키는 두 가지 점을 명시하고 싶었습니다.
- 나는 그 안에 제스처 인식기를 만들고 그것을 임대 속성에 저장하고 있었습니다.보기에 이 제스처 기록을 추가할 수 없습니다.초기화 중에 제스처 인식기에 전달된 자체 개체일 수 있으며, 올바르게 구성되지 않았습니다.
- 제스처 인식기를 프레임이 0인 보기에 추가해서는 안 됩니다.제로 프레임으로 모든 보기를 작성한 다음 자동 레이아웃을 사용하여 크기를 조정합니다.자동 레이아웃 엔진에서 보기 크기를 조정한 후 제스처 인식기를 추가해야 합니다.그래서 저는 viewDidAppear에 제스처 인식기를 추가했고 그것들은 작동합니다.
xCode 9.3, Swift 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) {
}
}
내부 뷰 DidLoad
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)
}
다음과 같은 빠른 코드를 시도합니다(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!)
}
}
하는 대신 myView의 UITapGestureRecognizer를할 수 .handleTap
함수를 선택합니다.
제스처 인식기에 직접 액세스하지 않고 보기를 활성화하려는 사용자는 제스처 인식기를 누릅니다.페이지로 돌아갈 때 이전에 탭으로 채워진 버블을 채워야 했습니다.저는 그 버블 태그(거품)들을 추적했습니다...
func fillBubs(bubs: [Int]) {
for bub in bubs {
let bubble = view.viewWithTag(bub)
if bubble == nil {continue}
for g in bubble!.gestureRecognizers! {
let tap = g as! UITapGestureRecognizer
handleBub(tap)
}
}
}
@objc func handleBub(_ sender: UITapGestureRecognizer? = nil) {
let bubble = sender?.view!
bubble?.layer.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
}
언급URL : https://stackoverflow.com/questions/28675209/how-to-call-gesture-tap-on-uiview-programmatically-in-swift
'programing' 카테고리의 다른 글
pep8.py 을 Eclipse에 통합하는 방법은 무엇입니까? (0) | 2023.05.21 |
---|---|
Visual Studio - Resx 파일의 기본값은 'internal'에서 'public'입니다. (0) | 2023.05.21 |
Git 상태는 내용이 동일하더라도 파일이 변경된 것으로 표시됩니다. (0) | 2023.05.21 |
리눅스 셸에서 변수로 나눗셈을 어떻게 할 수 있습니까? (0) | 2023.05.21 |
도커가 postgresql이 실행될 때까지 기다립니다. (0) | 2023.05.21 |