■はじめに
メルカリのiOSアプリのような横スクロールでメニューを切り替えられるライブラリである、HMSegmentedControlを試してみました。
■開発環境
・Xcode 10.1
・Swift 4.2.1
・HMSegmentedControl 1.5.5
■サンプルのイメージ
■実装部分
1.以下HMSegmentedControlのドキュメントにしたがってライブラリをインストール
https://github.com/HeshamMegid/HMSegmentedControl
2.StoryboardでUIViewとUIScrollViewを配置
3.ViewController.swiftに以下実装
import UIKit
import HMSegmentedControl
class ViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var headerView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
var segmentedControls: HMSegmentedControl!
override func viewDidLoad() {
super.viewDidLoad()
let statusbarHeight: CGFloat = UIApplication.shared.statusBarFrame.height
self.segmentedControls = HMSegmentedControl(frame: CGRect(x: 0, y: statusbarHeight, width: self.view.frame.size.width, height:self.headerView.frame.size.height))
self.segmentedControls.sectionTitles = ["Menu1", "Menu2", "Menu3"]
self.segmentedControls.selectionIndicatorLocation = HMSegmentedControlSelectionIndicatorLocation.down
self.segmentedControls.selectionStyle = HMSegmentedControlSelectionStyle.fullWidthStripe
self.segmentedControls.selectionIndicatorColor = UIColor(red: 30/255, green: 144/255, blue: 255/255, alpha: 1.0)
self.segmentedControls.selectionIndicatorHeight = 2.0
self.segmentedControls.selectedTitleTextAttributes = [
NSAttributedString.Key.foregroundColor: UIColor(red: 30/255, green: 144/255, blue: 255/255, alpha: 1.0),
NSAttributedString.Key.font: UIFont(name: "HiraginoSans-W6", size: 16)!
]
self.segmentedControls.titleTextAttributes = [
NSAttributedString.Key.foregroundColor: UIColor.lightGray,
NSAttributedString.Key.font: UIFont(name: "HiraginoSans-W6", size: 16)!
]
self.view.addSubview(segmentedControls)
let blockVariable: IndexChangeBlock = {(index: Int) -> Void in
let frame = CGRect(x: self.scrollView.frame.size.width * CGFloat(index), y: 0, width: self.scrollView.frame.size.width, height: self.scrollView.frame.size.height)
self.scrollView.scrollRectToVisible(frame, animated: true)
}
segmentedControls.indexChangeBlock = blockVariable
scrollView.delegate = self
scrollView.isPagingEnabled = true
scrollView.showsHorizontalScrollIndicator = false
scrollView.contentSize = CGSize(width: self.view.frame.size.width * 3, height: self.scrollView.frame.size.height)
let menu1 = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.scrollView.frame.size.height))
menu1.backgroundColor = UIColor.cyan
self.scrollView.addSubview(menu1)
let menu2 = UIView(frame: CGRect(x: self.view.frame.size.width, y: 0, width: self.view.frame.size.width, height: self.scrollView.frame.size.height))
menu2.backgroundColor = UIColor.red
self.scrollView.addSubview(menu2)
let menu3 = UIView(frame: CGRect(x: self.view.frame.size.width * 2, y: 0, width: self.view.frame.size.width, height: self.scrollView.frame.size.height))
menu3.backgroundColor = UIColor.green
self.scrollView.addSubview(menu3)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
segmentedControls.selectedSegmentIndex = Int(scrollView.contentOffset.x / scrollView.frame.maxX)
}
}
■おわりに
HMSegmentedControlを使った実装に関して、Swift 4系で実装している記事がなかったので記事にしてみました。また、他の記事よりも各実装内容に対してコメントを多めに書いてみたので、少しでも参考になればと思います。
■関連リンク
・GitHub - HeshamMegid/HMSegmentedControl: A drop-in replacement for UISegmentedControl mimicking the style of the segmented control used in Google Currents and various other Google products.
・iOSでマテリアルデザインのようなタブが作れるHMSegmentedControl | DevelopersIO
・Swift 2 - HMSegmentedControlにてタブ部分とScrollViewを連動させる方法|teratail