前提・実現したいこと
SwiftでコードのみでiOSアプリを実装しています。
上部にタグを設置して各タグを選択時に下部のViewを切り替えて、各View内は行単位で情報を表示しています。
その行単位でセットしている中で画像をいくつかセットしているのですが、その画像をタップしたときのイベントを取得したいです。
↓View内の各行のイメージ
----------------
〇〇 △△ 画像① 画像② 画像③
----------------
画像①~③のタップ時にそれぞれの動作をさせたいです。
例)
画像①タップ時:B画面へ遷移
画像②タップ時:再読み込み
画像③タップ時:C画面へ遷移
※伝わりづらくてすみませんが、お力を貸してください。
お力添えをいただきタップイベントは取得できましたので、ソースコードを修正しました。
→タップしたものの判別処理で悩んでいます。
発生している問題・エラーメッセージ
●CAPSPageMenuを使用してタブによる画面の切り換えは動作しています。
→縦スクロールもしたいため、scrollviewを使用してViewの実装を行うとタップイベントが取得できない
→scrollview用のクラスを作成してみたのですが、反応せず。
該当のソースコード
ViewController
1import UIKit 2 3class ViewController: UIViewController { 4 5 var activityIndicator: UIActivityIndicatorView! 6 var pageMenu : CAPSPageMenu? 7 var dispatch = DispatchGroup() 8 9 var controllerArray : [UIViewController] = [] 10 var viewCtl : SubViewController! 11 12 var iWidthScreen:CGFloat = 0.0 13 var iHeightScreen:CGFloat = 0.0 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 // プログレスバー表示 19 activityIndicator = UIActivityIndicatorView() 20 activityIndicator.color = UIColor.gray 21 activityIndicator.transform = CGAffineTransform(scaleX: 3, y: 3) 22 activityIndicator.frame = CGRect(x: 0, y: self.view.frame.height * 0.7, width: self.view.frame.width, height: 100) 23 activityIndicator.hidesWhenStopped = true 24 self.view.addSubview(activityIndicator) 25 activityIndicator.startAnimating() 26 27 // 画面サイズを取得する 28 iWidthScreen = self.view.frame.size.width 29 iHeightScreen = self.view.frame.size.height 30 31 // タイトル 32 let lblTitleFacility = UILabel() 33 lblTitleFacility.frame = CGRect(x: 0, y: 45, width: iWidthScreen - 10, height: 5) 34 lblTitleFacility.text = "タイトル" 35 lblTitleFacility.textColor = UIColor.white 36 lblTitleFacility.font = UIFont.systemFont(ofSize: 16) 37 lblTitleFacility.textAlignment = NSTextAlignment.center 38 self.view.addSubview(lblTitleFacility) 39 } 40 41 override func viewDidAppear(_ animated: Bool) { 42 // APIから情報を取得 43 let sParam = 省略 44 let sData = sParam.data(using: String.Encoding.utf8) 45 46 // info.plistファイルに設定しAPIのURLを表示 47 let urlString = 省略 48 49 if let url = URL(string: urlString!) { 50 let req = NSMutableURLRequest(url: url) 51 self.dispatch = DispatchGroup() 52 self.dispatch.enter() 53 req.httpMethod = "POST" 54 req.httpBody = sData 55 let task = URLSession.shared.dataTask(with: req as URLRequest, completionHandler: { (data, resp, err) in 56 do { 57 let json:NSArray = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 58 59 for data in json { 60 // データ取得 61 let aData = data as! Dictionary<String, AnyObject> 62 // タブの追加 63 self.viewCtl = SubViewController() 64 // タブ名をセット 65 self.viewCtl.title = "タブ" 66 // 各種コントロールセット 67 省略 68 } 69 self.dispatch.leave() 70 } 71 }) 72 task.resume() 73 } 74 75 dispatch.notify(queue: .main) { 76 // PageMenuの設定 77 let parameters: [CAPSPageMenuOption] = [ 78 .bottomMenuHairlineColor(CustomClass.CustomUIColor().rgba()), 79 .centerMenuItems(true), 80 .menuItemFont(UIFont.systemFont(ofSize: 14)), 81 .menuItemSeparatorWidth(4.3), 82 .menuItemSeparatorPercentageHeight(0.1), 83 .menuItemWidthBasedOnTitleTextWidth(true), 84 .selectedMenuItemLabelColor(CustomClass.CustomUIColor().rgba()), 85 .selectionIndicatorColor(CustomClass.CustomUIColor().rgba()), 86 .unselectedMenuItemLabelColor(UIColor.white) 87 ] 88 // PageMenuのビューのサイズを設定 89 self.pageMenu = CAPSPageMenu(viewControllers: self.controllerArray, frame: CGRect(x:0, y:70, width:self.view.frame.width, height:self.view.frame.height * 0.86), pageMenuOptions: parameters) 90 // PageMenuのビューを親のビューに追加 91 self.view.addSubview(self.pageMenu!.view) 92 // PageMenuのビューをToolbarの後ろへ移動 93 self.view.sendSubviewToBack(self.pageMenu!.view) 94 self.pageMenu!.didMove(toParent: self) 95 96 self.activityIndicator.stopAnimating() 97 } 98 } 99 100}
SubViewController
1import UIKit 2 3class SubViewController: UIViewController, UIGestureRecognizerDelegate { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 // 画面サイズを取得する 9 let iWidthScreen:CGFloat = self.view.frame.size.width 10 let iHeightScreen:CGFloat = self.view.frame.size.height 11 12 // タップのインスタンス生成 13 let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tapped(_:))) 14 tapGesture.delegate = self 15 self.view.addGestureRecognizer(tapGesture) 16 17 let scrollView = CustomScrollView() 18 scrollView.frame = CGRect(x: 0, y: 15, width: iWidthScreen, height: iHeightScreen * 0.8) 19 scrollView.contentSize = CGSize(width: iWidthScreen, height: 750) // 80 * n + 30 20 scrollView.isUserInteractionEnabled = true 21 22 // 1セル分のコントロールを生成する 23 let view = UIView() 24 view.frame = CGRect(x: 5, y: Int(80 * iNum - 60), width: Int(iWidthScreen - 10), height: 65) 25 view.layer.borderWidth = 1 26 view.layer.borderColor = UIColor.gray.cgColor 27 view.isUserInteractionEnabled = true 28 29 // サイズを取得する 30 let iWidthVScreen:CGFloat = view.frame.size.width 31 let iHeightVScreen:CGFloat = view.frame.size.height 32 33 // 各コントロールを配置 34 let sw = UISwitch() 35 sw.frame = CGRect(x: 5, y: Int(iHeightVScreen * 0.3), width: Int(iWidthVScreen * 0.2), height: 5) 36 sw.transform = CGAffineTransform(scaleX: 0.75, y: 0.75) 37 view.addSubview(sw) 38 39 // 名前 40 let lblName = UILabel() 41 lblName.frame = CGRect(x: iWidthVScreen * 0.15, y: iHeightVScreen * 0.3, width: iWidthVScreen * 0.3, height: iHeightVScreen * 0.4) 42 lblName.text = "名前" 43 lblName.textColor = UIColor.white 44 lblName.font = UIFont.boldSystemFont(ofSize: 22) 45 view.addSubview(lblName) 46 47 // 年齢 48 let lblAge = UILabel() 49 lblAge.frame = CGRect(x: iWidthVScreen * 0.15, y: iHeightVScreen * 0.3, width: iWidthVScreen * 0.3, height: iHeightVScreen * 0.4) 50 lblAge.text = "20歳" 51 lblAge.textColor = UIColor.white 52 lblAge.font = UIFont.boldSystemFont(ofSize: 22) 53 view.addSubview(lblAge) 54 55 // 画像1 56 let imgone = UIImage(named: image1) 57 let imgViewone = UIImageView(image: imgone) 58 imgViewone.frame = CGRect(x: iWidthVScreen * 0.8, y: iHeightVScreen * 0.3, width: 30, height: 30) 59 imgViewone.tag = 100 60 view.addSubview(imgViewone) 61 62 // 画像2 63 let imgtwo = UIImage(named: image2) 64 let imgViewtwo = UIImageView(image: imgtwo) 65 imgViewtwo.frame = CGRect(x: iWidthVScreen * 0.8, y: iHeightVScreen * 0.3, width: 30, height: 30) 66 imgViewtwo.tag = 200 67 view.addSubview(imgViewtwo) 68 69 // 画像3 70 let imgthree = UIImage(named: image3) 71 let imgViewthree = UIImageView(image: imgthree) 72 imgViewthree.frame = CGRect(x: iWidthVScreen * 0.8, y: iHeightVScreen * 0.3, width: 30, height: 30) 73 imgViewthree.tag = 300 74 view.addSubview(imgViewthree) 75 76 scrollView.addSubview(view) 77 self.view.addSubview(scrollView) 78 } 79 80 @objc func tapped(_ sender: UITapGestureRecognizer) { 81 if sender.state == .ended { 82 print("タップしました!") 83 } 84 } 85 86}
補足情報(FW/ツールのバージョンなど)
Mac
Swift 3
iOS
回答2件
あなたの回答
tips
プレビュー