質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3965閲覧

[Swift] FSCalendarのリサイズに伴う表示の調整

hameji001

総合スコア639

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/01/01 10:01

たまには自分も質問しようと思います。
swiftでFSCalendarを組み込んだアプリを作成しています。
viewの上半分にFSCalendarViewを、下半分にtableviewを配置しております。

FSCalendarViewにはUISwipeGestureRecognizerをつけていて、
上にスワイプするとFSCalendarViewが週間表示に
下にスワイプすると全画面表示になるようにしております。

Viewの大きさ自体は変わって、tableviewもそれに合わせ、調整されるのですが、
FSCalendarViewの中身が動かなくて、困っています。
全画面表示なのに、内容のカレンダーがそのままの位置
週間表示も1行表示になっただけで、微妙に空白が存在したままになっています。

storyboardで最初にviewの高さを設定していて、
その時の表示が固定されていて動かない感じです。
もちろん、コンストレインに@IBOutletをつけて、
大きさの変更および内在viewのresizeのfuncは呼び出しているのですが、
働いてない印象を受けます。

FSCalendarViewに詳しい人、返信いただけると助かります。

初期View
イメージ説明

下にスワイプ
イメージ説明

上にスワイプ
イメージ説明

Swift

1class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FSCalendarDelegate, FSCalendarDataSource, FSCalendarDelegateAppearance { 2 3 var drawingHeight : CGFloat = 0.0 4 @IBOutlet weak var calendarView: FSCalendar! 5 @IBOutlet weak var calendarViewHeight: NSLayoutConstraint! 6 7 override func viewDidLoad() { 8 let a = self.view.frame.height 9 let b = self.navigationController?.navigationBar.frame.height 10 let c = self.tabBarController?.tabBar.frame.height 11 let d = UIApplication.shared.statusBarFrame.height 12 self.drawingHeight = a - b! - c! - d 13 14 // gesture settings 15 let swipUpGesture:UISwipeGestureRecognizer = UISwipeGestureRecognizer( 16 target: self, 17 action: #selector(ListViewController.swipUp)) 18 swipUpGesture.direction = .up 19 let swipDownGesture:UISwipeGestureRecognizer = UISwipeGestureRecognizer( 20 target: self, 21 action: #selector(ListViewController.swipDown)) 22 swipDownGesture.direction = .down 23 self.calendarView.addGestureRecognizer(swipUpGesture) 24 self.calendarView.addGestureRecognizer(swipDownGesture) 25 } 26 27 // MARK: -- gesture Recognition 28 @objc func swipUp() { 29 print("swiped up") 30 if self.calendarViewHeight.constant == self.drawingHeight { 31 self.calendarViewHeight.constant = self.drawingHeight * 0.5 32 self.view.updateConstraintsIfNeeded() 33 } else if self.calendarViewHeight.constant == self.drawingHeight * 0.5 { 34 self.calendarView.setScope(.week, animated: false) 35 self.calendarViewHeight.constant = self.drawingHeight * 0.25 36 self.view.updateConstraintsIfNeeded() 37 } else { 38 // UIAlert 39 } 40 } 41 42 @objc func swipDown() { 43 print("swiped down") 44 if self.calendarViewHeight.constant == self.drawingHeight * 0.25 { 45 self.calendarView.setScope(.month, animated: false) 46 self.calendarViewHeight.constant = self.drawingHeight * 0.5 47 self.view.updateConstraintsIfNeeded() 48 } else if self.calendarViewHeight.constant == self.drawingHeight * 0.5 { 49 self.calendarViewHeight.constant = self.drawingHeight 50 self.view.updateConstraintsIfNeeded() 51 } else { 52 // 何もないときはできないよ 53 } 54 } 55 56}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、浮動小数点の計算結果が特定の値になっているか ==で比較するのは御法度です。
https://teratail.com/questions/43466
を参考にしてください。

それで、
https://qiita.com/Koutya/items/f5c7c12ab1458b6addcd
の「3.カレンダーのモード変更」の説明を参考にするとよいと思います。

swipUp、swipDownのメソッドは

swift

1 @objc func swipUp() { 2 print("swiped up") 3 self.calendarView.setScope(.week, animated: false) 4 } 5 6 @objc func swipDown() { 7 print("swiped down") 8 self.calendarView.setScope(.month, animated: false) 9 }

のようにモード変更を設定するだけにし、

swift

1 func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) { 2 print(bounds) 3 calendarViewHeight.constant = bounds.height 4 self.view.layoutIfNeeded() 5 }

を実装して、boundingRectWillChangeメソッドの中で、モード変更に応じた高さにcalendarViewHeightを設定するとうまくいくと思います。

投稿2019/01/01 16:50

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hameji001

2019/01/01 16:59

TakeOneさん ありがとうございます。 浮動小数点の計算結果を==で比較してはいけないことを初めて知りました。 見ると、基本的な事項のようで、今日まで知らずお恥ずかしいです。 いただいたアドバイスのもと組み直してみます。 実現できたら、ベストアンサーに選ばせていただきます。
hameji001

2019/01/01 17:09

ありがとうございました。実現できました。 全画面表示にすることも考えてまして、 それは表示設定に新たなグローバル変数を設定し、 表示するのに挑戦してみようと思ってます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問