下記のURLでボイスメモなどで使うようなボタンを作ったのですが、Autolayoutをつけるとボタンが巨大化してしまいました。
https://swift-ios.keicode.com/ios/how-to-create-record-button.php
Autolayoutなしだと白い円の内側に縮小するのですが、つけるとなぜか拡大します。
上はtableView、下はUIViewで、その中にさらにViewを2つと、ボタンを1つ置いています。
tableView
UIView(baseView)
-> outerCircle
-> innerCircle
-> recordButton
という構成にしてあり、それぞれbaseViewに対して、幅と高さを固定にし、Horizontal in ContainerとVertical in Containerを0にしました。以下、構成図です。
下記が全文なのですが、オートレイアウトをつけるまでは何も異常がありませんでした。
アニメーションの中でcornerRadiousで縮小するはずなのですが、逆に拡大してしまいます。
これは何かのバグなのか、それともオートレイアウトの何らかの制約があるのでしょうか?
どなたか分かる方がおりましたら、助言をいただけたら幸いです。
import UIKit import AVFoundation class ViewController: UIViewController, AVAudioRecorderDelegate, UITableViewDelegate, UITableViewDataSource { var isRecording = false var recordingSession: AVAudioSession! var audioRecorder: AVAudioRecorder! var audioPlayer: AVAudioPlayer! var w: CGFloat = 0 var h: CGFloat = 0 let d: CGFloat = 50 let l: CGFloat = 28 var numberOfRecords: Int = 0 @IBOutlet weak var recordButton: UIButton! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var baseView: UIView! @IBOutlet weak var outerCircle: UIView! @IBOutlet weak var innerCircle: UIView! @IBAction func record(_ sender: Any) { // Check if we have an active recorder if audioRecorder == nil { numberOfRecords += 1 let fileName = getDirectory().appendingPathComponent("(numberOfRecords).m4a") let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 12000, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue] // Start audio recording do { audioRecorder = try AVAudioRecorder(url: fileName, settings: settings) audioRecorder.delegate = self audioRecorder.record() } catch { displayAlert(title: "Ups!!!", message: "Recording failed") } UIView.animate(withDuration: 0.2) { self.recordButton.frame = CGRect(x:(self.w-self.d)/2,y:(self.h-self.d)/2,width: 30,height: 30) self.recordButton.layer.cornerRadius = 3.0 self.recordButton.layer.masksToBounds = true } } else { // Stopping audio recording audioRecorder.stop() audioRecorder = nil UserDefaults.standard.set(numberOfRecords, forKey: "myNumber") tableView.reloadData() UIView.animate(withDuration: 0.2) { self.recordButton.frame = CGRect(x:(self.w-self.self.l)/2,y:(self.h-self.l)/2,width: self.l,height: self.l) self.recordButton.layer.cornerRadius = 25 } } isRecording = !isRecording } override func viewDidLoad() { super.viewDidLoad() // Setting Up Session recordingSession = AVAudioSession.sharedInstance() if let number: Int = UserDefaults.standard.object(forKey: "myNumber") as? Int { numberOfRecords = number } AVAudioSession.sharedInstance().requestRecordPermission { (hasPermission) in if hasPermission{ print("ACCEPTED") } } } override func viewDidAppear(_ animated: Bool) { w = baseView.frame.size.width h = baseView.frame.size.height initRoundCorners() recordButton.layer.masksToBounds = true recordButton.layer.cornerRadius = 25 } // Function that gets path to directory func getDirectory() -> URL { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let documentDirectory = paths[0] return documentDirectory } // Function that displays an alert func displayAlert(title: String, message: String){ let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "dismiss", style: .default, handler: nil)) present(alert, animated: true, completion: nil) } func recordButtonCustomize(){ recordButton.layer.masksToBounds = true recordButton.layer.cornerRadius = 25.0 } func initRoundCorners(){ recordButton.layer.masksToBounds = true baseView.layer.masksToBounds = true baseView.layer.cornerRadius = 10 baseView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] outerCircle.layer.masksToBounds = true outerCircle.layer.cornerRadius = 31 outerCircle.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) innerCircle.layer.masksToBounds = true innerCircle.layer.cornerRadius = 29 innerCircle.backgroundColor = #colorLiteral(red: 0.1298420429, green: 0.1298461258, blue: 0.1298439503, alpha: 1) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return numberOfRecords } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.text = String(indexPath.row + 1) return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let path = getDirectory().appendingPathComponent("(indexPath.row + 1).m4a") do { audioPlayer = try AVAudioPlayer(contentsOf: path) audioPlayer.play() } catch { } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。