From 00af756289f4c789fa3b0eb4668a6c0a92202c99 Mon Sep 17 00:00:00 2001 From: Ogijun2018 Date: Thu, 14 Sep 2023 00:06:29 +0900 Subject: [PATCH] =?UTF-8?q?Detail/Record/SettingVC=E3=82=92=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=83=99=E3=83=BC=E3=82=B9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ClapWatch/Base.lproj/Main.storyboard | 196 +----------------- .../DetailViewController.swift | 129 ++++++++---- .../RecordViewController.swift | 98 +++++---- .../SettingViewController.swift | 36 +++- 4 files changed, 170 insertions(+), 289 deletions(-) diff --git a/ClapWatch/Base.lproj/Main.storyboard b/ClapWatch/Base.lproj/Main.storyboard index 0fb1387..64d6e4c 100644 --- a/ClapWatch/Base.lproj/Main.storyboard +++ b/ClapWatch/Base.lproj/Main.storyboard @@ -4,8 +4,6 @@ - - @@ -30,210 +28,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -296,9 +109,7 @@ - - @@ -307,8 +118,5 @@ - - - diff --git a/ClapWatch/ViewControllers/DetailViewController.swift b/ClapWatch/ViewControllers/DetailViewController.swift index 9078b73..531f04e 100644 --- a/ClapWatch/ViewControllers/DetailViewController.swift +++ b/ClapWatch/ViewControllers/DetailViewController.swift @@ -8,26 +8,79 @@ import UIKit import RealmSwift -class DetailViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { - var recordDate: String! - var laps: List! - var totalTime: String! - var copyTargetText: String! = "" - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var recordDateLabel: UILabel! - @IBOutlet weak var totalTimeLabel: UILabel! - @IBOutlet weak var clockImg: UIButton! - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. +class DetailViewController: UIViewController { + var laps: List + var copyTargetText: String = "" + + var tableView = UITableView(frame: .zero, style: .insetGrouped) + var recordDateLabel: UILabel = { + let label = UILabel() + label.font = UIFont(name: "AvenirNext-Bold", size: 30) + return label + }() + var totalTimeLabel: UILabel = { + let label = UILabel() + label.font = UIFont(name: "AvenirNext-DemiBold", size: 25) + return label + }() + let clockImg = UIImageView(image: .init(systemName: "clock")) + var copyButton: UIButton = { + let button = UIButton() + button.setImage(.init(systemName: "doc.on.clipboard", withConfiguration: UIImage.SymbolConfiguration(scale: .large)), for: .normal) + button.backgroundColor = .systemGray6 + button.layer.masksToBounds = true + button.layer.cornerRadius = 25 + return button + }() + + init(recordDate: String, laps: List, totalTime: String) { + self.laps = laps + super.init(nibName: nil, bundle: nil) recordDateLabel.text = recordDate - recordDateLabel.font = UIFont(name: "AvenirNext-Bold", size: 30) totalTimeLabel.text = totalTime - totalTimeLabel.font = UIFont(name: "AvenirNext-DemiBold", size: 25) - clockImg.isEnabled = false } - - // 追加 画面が表示される際などにtableViewのデータを再読み込みする + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + let objects = [ + "table": tableView, + "date": recordDateLabel, + "time": totalTimeLabel, + "clock": clockImg, + "copy": copyButton + ] + + view.addSubview(tableView) + view.addSubview(recordDateLabel) + view.addSubview(totalTimeLabel) + view.addSubview(clockImg) + view.addSubview(copyButton) + + tableView.delegate = self + tableView.dataSource = self + view.backgroundColor = .white + + objects.forEach { $1.translatesAutoresizingMaskIntoConstraints = false } + + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[date]-(>=0)-|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[clock(==20)]-5-[time]-(>=0)-[copy(==50)]-20-|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[table]|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-20-[date]-[time]-20-[table]|", metrics: nil, views: objects)) + clockImg.centerYAnchor.constraint(equalTo: totalTimeLabel.centerYAnchor).isActive = true + copyButton.centerYAnchor.constraint(equalTo: totalTimeLabel.centerYAnchor).isActive = true + copyButton.heightAnchor.constraint(equalToConstant: 50).isActive = true + + copyButton.addAction(.init { [weak self] _ in + guard let self else { return } + self.copyLap() + }, for: .touchUpInside) + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView.reloadData() @@ -37,24 +90,8 @@ class DetailViewController: UIViewController, UITableViewDelegate, UITableViewDa num += 1 } } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - // todoItemの数 = セルの数 - return laps.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell: UITableViewCell = UITableViewCell(style: .value1, reuseIdentifier: "cell") - let object = laps[indexPath.row] - cell.textLabel?.text = "Lap \(indexPath.row + 1)" - cell.detailTextLabel?.text = object.time - cell.textLabel?.font = UIFont(name: "AvenirNext-DemiBold", size: 15) - cell.detailTextLabel?.font = UIFont(name: "AvenirNext-DemiBold", size: 15) - return cell - } - - // MARK: - copyLap() - @IBAction func copyLap() { + + private func copyLap() { UIPasteboard.general.string = copyTargetText let alertController:UIAlertController = UIAlertController(title:"Lap Copied!", @@ -69,16 +106,20 @@ class DetailViewController: UIViewController, UITableViewDelegate, UITableViewDa alertController.addAction(defaultAction) present(alertController, animated: true, completion: nil) } - - - /* - // MARK: - Navigation +} - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. +extension DetailViewController: UITableViewDelegate, UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return laps.count } - */ + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell: UITableViewCell = UITableViewCell(style: .value1, reuseIdentifier: "cell") + let object = laps[indexPath.row] + cell.textLabel?.text = "Lap \(indexPath.row + 1)" + cell.detailTextLabel?.text = object.time + cell.textLabel?.font = UIFont(name: "AvenirNext-DemiBold", size: 15) + cell.detailTextLabel?.font = UIFont(name: "AvenirNext-DemiBold", size: 15) + return cell + } } diff --git a/ClapWatch/ViewControllers/RecordViewController.swift b/ClapWatch/ViewControllers/RecordViewController.swift index 5bddf11..195eda6 100644 --- a/ClapWatch/ViewControllers/RecordViewController.swift +++ b/ClapWatch/ViewControllers/RecordViewController.swift @@ -11,26 +11,31 @@ import AVFoundation import MediaPlayer import RealmSwift -class RecordViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { - @IBOutlet weak var recordTableView: UITableView! +class RecordViewController: UIViewController { + private var recordTableView: UITableView = { + let tableView = UITableView() + tableView.rowHeight = 60 + return tableView + }() var ItemList: Results! - -// @IBOutlet weak var deleteButton: UIButton! - var emptyLabel: UILabel = UILabel() - var deleteButton: UIBarButtonItem! + + var emptyLabel: UILabel = { + let label = UILabel() + label.textAlignment = .center + label.text = "No Records" + label.textColor = .gray + return label + }() + var recordDate: String? + var laps: List? + var totalTime: String? override func viewDidAppear(_ animated: Bool) { - self.recordTableView.reloadData() - self.recordTableView.rowHeight = 60 + recordTableView.reloadData() - emptyLabel.frame = self.recordTableView.frame - emptyLabel.textAlignment = NSTextAlignment.center - emptyLabel.text = "No Records" - emptyLabel.textColor = .gray if(!self.ItemList.isEmpty){ emptyLabel.isHidden = true } - self.view.addSubview(emptyLabel) } @objc func deleteRecords(_ sender: Any) { @@ -59,22 +64,43 @@ class RecordViewController: UIViewController, UITableViewDelegate, UITableViewDa self.ItemList = RealmInstance1.objects(RecordModel.self) self.navigationItem.title = NSLocalizedString("Records", comment: "") self.navigationController?.navigationBar.barStyle = .default - self.navigationItem.largeTitleDisplayMode = .always + self.navigationItem.largeTitleDisplayMode = .automatic self.navigationController?.navigationBar.prefersLargeTitles = true - deleteButton = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(deleteRecords(_:))) - self.navigationItem.rightBarButtonItem = deleteButton + self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(deleteRecords(_:))) + + let objects = [ + "label": emptyLabel, + "table": recordTableView + ] + + view.addSubview(recordTableView) + view.addSubview(emptyLabel) + + recordTableView.delegate = self + recordTableView.dataSource = self + + objects.forEach { $1.translatesAutoresizingMaskIntoConstraints = false } + + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[label]|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[label]|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[table]|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[table]|", metrics: nil, views: objects)) + emptyLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true + emptyLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } - +} + +extension RecordViewController: UITableViewDelegate, UITableViewDataSource { // Table View Methods func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.ItemList.count } - + func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let deleteAction = UIContextualAction(style: .destructive, title: nil) { (_, _, completionHandler) in do{ @@ -92,7 +118,7 @@ class RecordViewController: UIViewController, UITableViewDelegate, UITableViewDa let configuration = UISwipeActionsConfiguration(actions: [deleteAction]) return configuration } - + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .value1, reuseIdentifier: "TableViewCell") let item: RecordModel = self.ItemList[(indexPath as NSIndexPath).row] @@ -108,37 +134,19 @@ class RecordViewController: UIViewController, UITableViewDelegate, UITableViewDa cell.detailTextLabel?.attributedText = fullString cell.textLabel?.font = UIFont(name: "AvenirNext-Medium", size: 15) cell.detailTextLabel?.font = UIFont(name: "AvenirNext-DemiBold", size: 17) - + return cell } - - var recordDate: String? - var laps: List? - var totalTime: String? - - // Cell が選択された場合 + func tableView(_ table: UITableView, didSelectRowAt indexPath: IndexPath) { let item: RecordModel = self.ItemList[(indexPath as NSIndexPath).row] + guard let date = item.date, let totalTime = item.totalTime else { return } let f = DateFormatter() f.dateFormat = "y/M/d HH:mm" - // 記録日とラップを渡す - recordDate = f.string(from: item.date!) - laps = item.laps - totalTime = item.totalTime! - if recordDate != nil && laps != nil && totalTime != nil { - // SubViewController へ遷移するために Segue を呼び出す - performSegue(withIdentifier: "Segue",sender: nil) - } - } - - // Segue 準備 - override func prepare(for segue: UIStoryboardSegue, sender: Any!) { - if (segue.identifier == "Segue") { - let subVC: DetailViewController = (segue.destination as? DetailViewController)! - // SubViewController のselectedImgに選択された画像を設定する - subVC.recordDate = recordDate - subVC.totalTime = totalTime - subVC.laps = laps - } + let vc = DetailViewController(recordDate: f.string(from: date), + laps: item.laps, + totalTime: totalTime) + vc.modalPresentationStyle = .pageSheet + present(vc, animated: true) } } diff --git a/ClapWatch/ViewControllers/SettingViewController.swift b/ClapWatch/ViewControllers/SettingViewController.swift index 5fe9f87..7ce3d4c 100644 --- a/ClapWatch/ViewControllers/SettingViewController.swift +++ b/ClapWatch/ViewControllers/SettingViewController.swift @@ -7,12 +7,25 @@ import UIKit -class SettingViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { - @IBOutlet weak var tableView: UITableView! +class SettingViewController: UIViewController { + + var tableView = UITableView(frame: .zero, style: .insetGrouped) override func viewDidLoad() { super.viewDidLoad() tableView.allowsMultipleSelection = true + tableView.delegate = self + tableView.dataSource = self + + let objects = ["table": tableView] + + view.addSubview(tableView) + objects.forEach { $1.translatesAutoresizingMaskIntoConstraints = false } + + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[table]|", metrics: nil, views: objects)) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[table]|", metrics: nil, views: objects)) + view.backgroundColor = .white + self.navigationItem.title = NSLocalizedString("Setting", comment: "") self.navigationController?.navigationBar.barStyle = .default self.navigationItem.largeTitleDisplayMode = .always @@ -52,11 +65,22 @@ class SettingViewController: UIViewController, UITableViewDelegate, UITableViewD } } - // MARK: TableView let sectionTitle = ["Start/Stop", "Lap"] - let icons = ["sensor.tag.radiowaves.forward", "waveform.path", "2.square", "3.square", "hand.draw.fill", "hand.draw"] - let labels = [NSLocalizedString("Proximity Sensor", comment: ""), NSLocalizedString("Shake", comment: ""), NSLocalizedString("Two-finger tap", comment: ""), NSLocalizedString("Three-finger tap", comment: ""), NSLocalizedString("Upward swipe", comment: ""), NSLocalizedString("Flick", comment: "")] + let icons = ["sensor.tag.radiowaves.forward", + "waveform.path", + "2.square", + "3.square", + "hand.draw.fill", + "hand.draw"] + let labels = [NSLocalizedString("Proximity Sensor", comment: ""), + NSLocalizedString("Shake", comment: ""), + NSLocalizedString("Two-finger tap", comment: ""), + NSLocalizedString("Three-finger tap", comment: ""), + NSLocalizedString("Upward swipe", comment: ""), + NSLocalizedString("Flick", comment: "")] +} +extension SettingViewController: UITableViewDelegate, UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return sectionTitle.count } @@ -126,7 +150,7 @@ class SettingViewController: UIViewController, UITableViewDelegate, UITableViewD } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "settingTableCell", for: indexPath) + let cell = UITableViewCell(style: .value1, reuseIdentifier: "cell") let img = UIImage(systemName:icons[indexPath.row]) cell.imageView?.image = img cell.textLabel?.text = labels[indexPath.row]