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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1715閲覧

swiftのTabPageViewControllerの上部タブの高さをTableView上下スクロール時に変更したい

kaji

総合スコア648

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/08/12 16:35

swiftのTabPageViewControllerの上部タブの高さをTableView上下スクロール時に変更したいです。

TabPageViewController公式ページ
https://github.com/EndouMari/TabPageViewController

TabPageViewControllerの
初期表示時に高さを変更して表示することはできました。

①のところを22に書き換えると初回表示時に高さが変更されて
表示されます。ただ、一旦表示した後、独自メソッドから後で変更しようとすると
22のまま固定されてしまいます。

⬇️TabPageViewControllerを継承したカスタムクラス

swift

1 class CustomTabPageViewController: TabPageViewController { 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 option.tabHeight = 32.0 // ① 5 } 6 func didReceiveMemoryWarning() { 7 super.didReceiveMemoryWarning() 8 } 9 func setTabHeight(height: CGFloat) { 10 option.tabHeight = height 11 print("height=" + String(option.tabHeight)) 12 // ここまで22と32が切り替わることを確認できました。 13 } 14 }

⬇️tcを管理するクラス

swift

1 var tc: CustomTabPageViewController = CustomTabPageViewController() 2 〜略〜 3 tc.option.tabHeight = 20 // 初期32 4 5 // 上下スクロール時に呼ばれる独自メソッド 6 func setBarHidden(hidden: Bool) { 7 if (_setBarHidden == hidden) { 8 return 9 } 10 if (hidden) { 11 tc.setTabHeight(22.0) 12 } else { 13 tc.setTabHeight(32.0) 14 } 15 } 16 }

また、切り替わることができたとコード内に記述したとおり
上下スクロール時に独自関数が呼ばれ
option.tabHeightが22と32で切り替わることを確認しました。

ライブラリの方を覗いたところ
TabPageViewController.swift
のタブ表示メソッドをみつけました。(option.tabHeightの部分)

swift

1 private func configuredTabView() -> TabView { 2 let tabView = TabView(isInfinity: isInfinity, option: option) 3 tabView.translatesAutoresizingMaskIntoConstraints = false 4 5 let height = NSLayoutConstraint(item: tabView, 6 attribute: .Height, 7 relatedBy: .Equal, 8 toItem: nil, 9 attribute: .Height, 10 multiplier: 1.0, 11 constant: option.tabHeight) 12 tabView.addConstraint(height) 13 view.addSubview(tabView)

しかし、configuredTabView()を読んでいるのは以下描画メソッドでtabView.superviewがnilのときだけ処理するような記述がありました。(これが初回にしか反映されない理由かなと思います。)

swift

1 override public func viewWillAppear(animated: Bool) { 2 super.viewWillAppear(animated) 3 4 if tabView.superview == nil { 5 tabView = configuredTabView() 6 } 7

しかし、tabViewを初期化するようなメソッドが見当たらず
tabViewも以下のようにprivateで宣言されており、上書きも許さないようになってました。

swift

1 lazy private var tabView: TabView = self.configuredTabView()

1,
あまりしないほうがいいかもしれませんが
privateを突破する裏技的な方法でTabViewを更新するとか
(phpだとrefrectionとかいうので突破できたりするので・・)

2,
そもそも別のやり方で高さを変更できるとか。

3,
ライブラリ更新が面倒になるのであまりやりたくありませんが、
ライブラリのunlockをはずしてライブラリを更新するとか。(流儀に反する?)

ありますでしょうか?
複数あればiPhone開発者として、
こうあるべきも含めて教えて欲しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

privateを突破する方法は知らないので、無理やり高さの制約を書き換えてみました。

swift

1func setTabHeight(height: CGFloat) { 2 option.tabHeight = height 3 print("height=" + String(option.tabHeight)) 4 // ここまで22と32が切り替わることを確認できました。 5 6 //ここから追加 7 if let tabView = view.subviews.last, constraint = tabView.constraints.last { 8 constraint.constant = height 9 //tabView.updateConstraintsIfNeeded() //たぶん呼ばなくて大丈夫 10 } 11 //ここまで追加 12}

やってることはこういうことです。

swift

1view.subviews[1].constraints[4].constant = height

subviews[1]がtabView、constraints[4]が高さの制約。
どっちも配列の最後なので.lastを使ってます。

色々と決め打ちなので、TabPageViewControllerがバージョンアップしたら動かなくなるかも。

投稿2016/08/15 01:59

fuzzball

総合スコア16731

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

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

kaji

2016/08/15 02:12

おー動きました!!2時間ぐらい悩んでたんですが fuzzballさんのおかげで解決できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問