Repository: wangmchn/WMPageController-Swift
Branch: master
Commit: 4c68bdc69568
Files: 42
Total size: 156.7 KB
Directory structure:
gitextract_5pm0eoic/
├── .gitignore
├── .travis.yml
├── LICENSE
├── PageController/
│ ├── FloodView.swift
│ ├── MenuItem.swift
│ ├── MenuView.swift
│ ├── PageController.swift
│ └── ProgressView.swift
├── README.md
├── StoryboardExample/
│ ├── StoryboardExample/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ ├── ParentController/
│ │ │ └── CustomPageController.swift
│ │ ├── TableViewController.swift
│ │ └── ViewController.swift
│ ├── StoryboardExample.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── StoryboardExample.xcscheme
│ ├── StoryboardExampleTests/
│ │ ├── Info.plist
│ │ └── StoryboardExampleTests.swift
│ └── StoryboardExampleUITests/
│ ├── Info.plist
│ └── StoryboardExampleUITests.swift
├── WMPageController-Swift/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ └── AppIcon.appiconset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── TableViewController.swift
│ └── ViewController.swift
├── WMPageController-Swift.podspec
├── WMPageController-Swift.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ ├── WMPageController-Swift.xcscheme
│ └── WMPageControllerSwiftFramework.xcscheme
├── WMPageController-SwiftTests/
│ ├── Info.plist
│ └── WMPageController_SwiftTests.swift
├── WMPageController-SwiftUITests/
│ ├── Info.plist
│ └── WMPageController_SwiftUITests.swift
└── WMPageControllerSwiftFramework/
├── Info.plist
└── WMPageControllerSwiftFramework.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
================================================
FILE: .travis.yml
================================================
language: objective-c
osx_image: xcode7.3
xcode_project: WMPageController-Swift.xcodeproj
xcode_scheme: WMPageControllerSwiftFramework
xcode_sdk: iphonesimulator9.3
env:
global:
- FRAMEWORK_NAME=WMPageControllerSwiftFramework
before_install:
- brew update
- brew outdated carthage || brew upgrade carthage
before_script:
before_deploy:
- carthage build --no-skip-current
- carthage archive WMPageControllerSwift
deploy:
provider: releases
api_key:
secure: hxnNtDAGGZFHRMxJF02POFZfDZq7mjYd+B1osAtCXPmf7wE+Twk3+Ax4VuFR3bGrtYCbegaSWFsrxwG7JOtqTzDQ6eIJvvK85N6+//MX3iyloO/sbtljgDEdDDdjwKiIK3pQhnL9F7Rd+3fz5JAVPYIkNEO5E7BnwvDIWQOxK/QtW5fhBmuGM1+YacvsQX8f+MrHjKslIsZp5DRaXXLtyDlV8eKwHef127+nRmnvkPBHVA/ZQhVMLAdcuNvzl64XXryDgNQxCDCqNw60IiIFnMNtaN1G1H9JwF0mQBWm4Pn8Yua+KV8rVOyW3F39YXFCrfcBIfgqJpeB7bzJr7WD2p2G4y1x2yAiXn1Dc5TpCrhnLffoJ3MtyD2KbgD/kVsKOtnfWAdAHyKIbSTQIEpHfRLcr7beucANxoDK4VMtARPsz1WGyzNqUU+Chguj32B6IXKB3NMifXy7syBBT59ZJzUCbyp1Om/CAJDCChP8EsByFD8AhDSYfZKvfO3NK/x+qZdgxV3EOiCrcF9q7rACA32yyxXTa75J+LzcsgN/ESd9GPOC8E8t0I86JdwwRlROGUNjcSRFOcGZ50Rrdd2c5L42rD1OOkTzUCAnacj2U2ewnyDREQ0SQ7EYsrVl8Mtzglb1VNISrsgscx2gJwCZXtbWIitMdcGCv6K1mMB9HNg=
file: WMPageControllerSwift.framework.zip
on:
repo: wangmchn/WMPageController-Swift
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015 Wang Ming
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: PageController/FloodView.swift
================================================
//
// FooldView.swift
// PageController
//
// Created by Mark on 15/10/20.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
class FloodView: ProgressView {
// MARK: - Vars
var hollow = false
fileprivate var margin: CGFloat = 0.0
fileprivate var radius: CGFloat = 0.0
fileprivate var height: CGFloat = 0.0
// MARK: - Private funcs
override func willMove(toSuperview newSuperview: UIView?) {
height = frame.size.height
margin = height * 0.15
radius = (height - margin * 2.0) / 2.0
}
override func draw(_ rect: CGRect) {
// Drawing code
let currentIndex = Int(progress)
let rate = progress - CGFloat(currentIndex)
let nextIndex = (currentIndex + 1) >= itemFrames.count ? currentIndex : currentIndex + 1
let currentFrame = itemFrames[currentIndex]
let currentWidth = currentFrame.size.width
let currentX = currentFrame.origin.x
let nextWidth = itemFrames[nextIndex].size.width
let nextX = self.itemFrames[nextIndex].origin.x
let startX = currentX + (nextX - currentX) * rate
let endX = startX + currentWidth + (nextWidth - currentWidth) * rate
let ctx = UIGraphicsGetCurrentContext()
ctx?.translateBy(x: 0.0, y: height)
ctx?.scaleBy(x: 1.0, y: -1.0)
ctx?.addArc(center: CGPoint(x: startX + radius, y: height / 2.0), radius: radius, startAngle: CGFloat(Double.pi / 2), endAngle: CGFloat(Double.pi / 2) * 3, clockwise: false)
// CGContextAddArc(ctx, startX + radius, height / 2.0, radius, CGFloat(M_PI_2), CGFloat(M_PI_2) * 3, 0)
ctx?.addLine(to: CGPoint(x: endX - radius, y: margin))
ctx?.addArc(center: CGPoint(x: endX - radius, y: height / 2.0), radius: radius, startAngle: CGFloat(-Double.pi / 2), endAngle: CGFloat(Double.pi / 2), clockwise: false)
// CGContextAddArc(ctx, endX - radius, height / 2.0, radius, CGFloat(-M_PI_2), CGFloat(M_PI_2), 0)
ctx?.closePath()
if hollow == true {
ctx?.setStrokeColor(color)
ctx?.strokePath()
return
}
ctx?.closePath()
ctx?.setFillColor(color)
ctx?.fillPath()
}
}
================================================
FILE: PageController/MenuItem.swift
================================================
//
// MenuItem.swift
// PageController
//
// Created by Mark on 15/10/20.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
protocol MenuItemDelegate: NSObjectProtocol {
func didSelectedMenuItem(_ menuItem: MenuItem)
}
class MenuItem: UILabel {
// MARK: - Public vars
var normalSize: CGFloat = 15.0
var selectedSize: CGFloat = 18.0
weak var delegate: MenuItemDelegate?
var selected = false {
didSet { rate = (selected == false) ? 0.0 : 1.0 }
}
var rate: CGFloat = 0.0 {
didSet {
let red = normalComponents.red + (selectedComponets.red - normalComponents.red) * rate
let green = normalComponents.green + (selectedComponets.green - normalComponents.green) * rate
let blue = normalComponents.blue + (selectedComponets.blue - normalComponents.blue) * rate
let alpha = normalComponents.alpha + (selectedComponets.alpha - normalComponents.alpha) * rate
let minScale = normalSize / selectedSize
let trueScale = minScale + (1 - minScale) * rate
textColor = UIColor(red: red, green: green, blue: blue, alpha: alpha)
transform = CGAffineTransform(scaleX: trueScale, y: trueScale)
}
}
var normalColor: UIColor? {
didSet {
normalColor?.getRed(&normalComponents.red, green: &normalComponents.green, blue: &normalComponents.blue, alpha: &normalComponents.alpha)
}
}
var selectedColor: UIColor? {
didSet {
selectedColor?.getRed(&selectedComponets.red, green: &selectedComponets.green, blue: &selectedComponets.blue, alpha: &selectedComponets.alpha)
}
}
// MARK: - Private vars
fileprivate var normalComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) = (0.0, 0.0, 0.0, 0.0)
fileprivate var selectedComponets: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) = (0.0, 0.0, 0.0, 0.0)
// MARK: - Public funcs
func selectWithAnimation(_ select: Bool) -> Void {
if selected == select { return }
UIView.animate(withDuration: 0.3, animations: { () -> Void in
if self.selected == true {
self.rate = 0.0
} else {
self.rate = 1.0
}
self.selected = select
})
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
// MARK: - Private funcs
fileprivate func setup() {
textAlignment = NSTextAlignment.center
isUserInteractionEnabled = true
backgroundColor = .clear
numberOfLines = 0
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
delegate?.didSelectedMenuItem(self)
}
}
================================================
FILE: PageController/MenuView.swift
================================================
//
// MenuView.swift
// PageController
//
// Created by Mark on 15/10/20.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
@objc public protocol MenuViewDelegate: NSObjectProtocol {
func menuView(_ menuView: MenuView, widthForItemAtIndex index: Int) -> CGFloat
@objc optional func menuView(_ menuView: MenuView, didSelectedIndex index: Int, fromIndex currentIndex: Int)
@objc optional func menuView(_ menuView: MenuView, itemMarginAtIndex index: Int) -> CGFloat
}
@objc public protocol MenuViewDataSource: NSObjectProtocol {
func menuView(_ menuView: MenuView, titleAtIndex index: Int) -> String
func numbersOfTitlesInMenuView(_ menuView: MenuView) -> Int
}
public enum MenuViewStyle {
case `default`, line, flood, fooldHollow
}
open class MenuView: UIView, MenuItemDelegate {
// MARK: - Public vars
override open var frame: CGRect {
didSet {
guard contentView != nil else { return }
let rightMargin = (rightView == nil) ? contentMargin : contentMargin + rightView!.frame.width
let leftMargin = (leftView == nil) ? contentMargin : contentMargin + leftView!.frame.width
let contentWidth = contentView.frame.width + leftMargin + rightMargin
let startX = (leftView != nil) ? leftView!.frame.origin.x : (contentView.frame.origin.x - contentMargin)
// Make the contentView center, because system will change menuView's frame if it's a titleView.
if (startX + contentWidth / 2 != bounds.width / 2) {
let xOffset = (contentWidth - bounds.width) / 2
contentView.frame.origin.x -= xOffset
rightView?.frame.origin.x -= xOffset
leftView?.frame.origin.x -= xOffset
}
}
}
open weak var leftView: UIView? {
willSet {
leftView?.removeFromSuperview()
}
didSet {
if let lView = leftView {
addSubview(lView)
}
resetFrames()
}
}
open weak var rightView: UIView? {
willSet {
rightView?.removeFromSuperview()
}
didSet {
if let rView = rightView {
addSubview(rView)
}
resetFrames()
}
}
open var contentMargin: CGFloat = 0.0 {
didSet {
guard contentView != nil else { return }
resetFrames()
}
}
open var style = MenuViewStyle.default
open var fontName: String?
open var progressHeight: CGFloat = 2.0
open var normalSize: CGFloat = 15.0
open var selectedSize: CGFloat = 18.0
open var progressColor: UIColor?
open weak var delegate: MenuViewDelegate?
open weak var dataSource: MenuViewDataSource!
open lazy var normalColor = UIColor.black
open lazy var selectedColor = UIColor(red: 168.0/255.0, green: 20.0/255.0, blue: 4/255.0, alpha: 1.0)
// MARK: - Private vars
fileprivate weak var contentView: UIScrollView!
fileprivate weak var progressView: ProgressView?
fileprivate weak var selectedItem: MenuItem!
fileprivate var itemFrames = [CGRect]()
fileprivate let tagGap = 6250
fileprivate var itemsCount: Int {
return dataSource.numbersOfTitlesInMenuView(self)
}
open func reload() {
itemFrames.removeAll()
progressView?.removeFromSuperview()
for subview in contentView.subviews {
subview.removeFromSuperview()
}
addMenuItems()
addProgressView()
}
// MARK: - Public funcs
open func slideMenuAtProgress(_ progress: CGFloat) {
progressView?.progress = progress
let tag = Int(progress) + tagGap
let rate = progress - CGFloat(tag - tagGap)
let currentItem = viewWithTag(tag) as? MenuItem
let nextItem = viewWithTag(tag + 1) as? MenuItem
if rate == 0.0 {
selectedItem.selected = false
selectedItem = currentItem
selectedItem.selected = true
refreshContentOffset()
return
}
currentItem?.rate = 1.0 - rate
nextItem?.rate = rate
}
open func selectItemAtIndex(_ index: Int) {
let tag = index + tagGap
let currentIndex = selectedItem.tag - tagGap
guard currentIndex != index && selectedItem != nil else { return }
let menuItem = viewWithTag(tag) as! MenuItem
selectedItem.selected = false
selectedItem = menuItem
selectedItem.selected = true
progressView?.moveToPosition(index, animation: false)
delegate?.menuView?(self, didSelectedIndex: index, fromIndex: currentIndex)
refreshContentOffset()
}
// MARK: - Update Title
open func updateTitle(_ title: String, atIndex index: Int, andWidth update: Bool) {
guard index >= 0 && index < itemsCount else { return }
let item = viewWithTag(tagGap + index) as? MenuItem
item?.text = title
guard update else { return }
resetFrames()
}
// MARK: - Update Frames
open func resetFrames() {
var contentFrame = bounds
if let rView = rightView {
var rightFrame = rView.frame
rightFrame.origin.x = contentFrame.width - rightFrame.width
rightView?.frame = rightFrame
contentFrame.size.width -= rightFrame.width
}
if let lView = leftView {
var leftFrame = lView.frame
leftFrame.origin.x = 0
leftView?.frame = leftFrame
contentFrame.origin.x += leftFrame.width
contentFrame.size.width -= leftFrame.width
}
contentFrame.origin.x += contentMargin
contentFrame.size.width -= contentMargin * 2
contentView.frame = contentFrame
resetFramesFromIndex(0)
refreshContentOffset()
}
open func resetFramesFromIndex(_ index: Int) {
itemFrames.removeAll()
calculateFrames()
for i in index ..< itemsCount {
let item = viewWithTag(tagGap + i) as? MenuItem
item?.frame = itemFrames[i]
}
if let progress = progressView {
var pFrame = progress.frame
pFrame.size.width = contentView.contentSize.width
if progress.isKind(of: FloodView.self) {
pFrame.origin.y = 0
} else {
pFrame.origin.y = frame.size.height - progressHeight
}
progress.frame = pFrame
progress.itemFrames = itemFrames
progress.setNeedsDisplay()
}
}
// MARK: - Private funcs
override open func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
guard contentView == nil else { return }
addScollView()
addMenuItems()
addProgressView()
}
fileprivate func refreshContentOffset() {
let itemFrame = selectedItem.frame
let itemX = itemFrame.origin.x
let width = contentView.frame.size.width
let contentWidth = contentView.contentSize.width
if itemX > (width / 2) {
var targetX: CGFloat = itemFrame.origin.x - width/2 + itemFrame.size.width/2
if (contentWidth - itemX) <= (width / 2) {
targetX = contentWidth - width
}
if (targetX + width) > contentWidth {
targetX = contentWidth - width
}
contentView.setContentOffset(CGPoint(x: targetX, y: 0), animated: true)
} else {
contentView.setContentOffset(CGPoint.zero, animated: true)
}
}
// MARK: - Create Views
fileprivate func addScollView() {
let scrollViewFrame = CGRect(x: contentMargin, y: 0, width: frame.size.width - contentMargin * 2, height: frame.size.height)
let scrollView = UIScrollView(frame: scrollViewFrame)
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
scrollView.backgroundColor = .clear
scrollView.scrollsToTop = false
addSubview(scrollView)
contentView = scrollView
}
fileprivate func addMenuItems() {
calculateFrames()
for index in 0 ..< itemsCount {
let menuItemFrame = itemFrames[index]
let menuItem = MenuItem(frame: menuItemFrame)
menuItem.tag = index + tagGap
menuItem.delegate = self
menuItem.text = dataSource.menuView(self, titleAtIndex: index)
menuItem.textColor = normalColor
if let optionalFontName = fontName {
menuItem.font = UIFont(name: optionalFontName, size: selectedSize)
} else {
menuItem.font = UIFont.systemFont(ofSize: selectedSize)
}
menuItem.normalSize = normalSize
menuItem.selectedSize = selectedSize
menuItem.normalColor = normalColor
menuItem.selectedColor = selectedColor
menuItem.selected = (index == 0) ? true : false
if index == 0 { selectedItem = menuItem }
contentView.addSubview(menuItem)
}
}
fileprivate func addProgressView() {
var optionalType: ProgressView.Type?
var hollow = false
switch style {
case .default: break
case .line: optionalType = ProgressView.self
case .fooldHollow:
optionalType = FloodView.self
hollow = true
case .flood: optionalType = FloodView.self
}
if let viewType = optionalType {
let pView = viewType.init()
let height = (style == .line) ? progressHeight : frame.size.height
let progressY = (style == .line) ? (frame.size.height - progressHeight) : 0
pView.frame = CGRect(x: 0, y: progressY, width: contentView.contentSize.width, height: height)
pView.itemFrames = itemFrames
if (progressColor == nil) {
progressColor = selectedColor
}
pView.color = (progressColor?.cgColor)!
pView.backgroundColor = .clear
if let fooldView = pView as? FloodView {
fooldView.hollow = hollow
}
contentView.insertSubview(pView, at: 0)
progressView = pView
}
}
// MARK: - Calculate Frames
fileprivate func calculateFrames() {
var contentWidth: CGFloat = itemMarginAtIndex(0)
for index in 0 ..< itemsCount {
let itemWidth = delegate!.menuView(self, widthForItemAtIndex: index)
let itemFrame = CGRect(x: contentWidth, y: 0, width: itemWidth, height: frame.size.height)
itemFrames.append(itemFrame)
contentWidth += itemWidth + itemMarginAtIndex(index + 1)
}
if contentWidth < contentView.frame.size.width {
let distance = contentView.frame.size.width - contentWidth
let itemMargin = distance / CGFloat(itemsCount + 1)
for index in 0 ..< itemsCount {
var itemFrame = itemFrames[index]
itemFrame.origin.x += itemMargin * CGFloat(index + 1)
itemFrames[index] = itemFrame
}
contentWidth = contentView.frame.size.width
}
contentView.contentSize = CGSize(width: contentWidth, height: frame.size.height)
}
fileprivate func itemMarginAtIndex(_ index: Int) -> CGFloat {
if let itemMargin = delegate?.menuView?(self, itemMarginAtIndex: index) {
return itemMargin
}
return 0.0
}
// MARK: - MenuItemDelegate
func didSelectedMenuItem(_ menuItem: MenuItem) {
if selectedItem == menuItem { return }
let position = menuItem.tag - tagGap
let currentIndex = selectedItem.tag - tagGap
progressView?.moveToPosition(position, animation: true)
delegate?.menuView?(self, didSelectedIndex: position, fromIndex: currentIndex)
menuItem.selectWithAnimation(true)
selectedItem.selectWithAnimation(false)
selectedItem = menuItem
refreshContentOffset()
}
}
================================================
FILE: PageController/PageController.swift
================================================
//
// PageController.swift
// PageController
//
// Created by Mark on 15/10/20.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
public enum CachePolicy: Int {
case noLimit = 0
case lowMemory = 1
case balanced = 3
case high = 5
}
public enum PreloadPolicy: Int {
case never = 0
case neighbour = 1
case near = 2
}
public let WMPageControllerDidMovedToSuperViewNotification = "WMPageControllerDidMovedToSuperViewNotification"
public let WMPageControllerDidFullyDisplayedNotification = "WMPageControllerDidFullyDisplayedNotification"
@objc public protocol PageControllerDataSource: NSObjectProtocol {
@objc optional func numberOfControllersInPageController(_ pageController: PageController) -> Int
@objc optional func pageController(_ pageController: PageController, viewControllerAtIndex index: Int) -> UIViewController
@objc optional func pageController(_ pageController: PageController, titleAtIndex index: Int) -> String
}
@objc public protocol PageControllerDelegate: NSObjectProtocol {
@objc optional func pageController(_ pageController: PageController, lazyLoadViewController viewController: UIViewController, withInfo info: NSDictionary)
@objc optional func pageController(_ pageController: PageController, willCachedViewController viewController: UIViewController, withInfo info: NSDictionary)
@objc optional func pageController(_ pageController: PageController, willEnterViewController viewController: UIViewController, withInfo info: NSDictionary)
@objc optional func pageController(_ pageController: PageController, didEnterViewController viewController: UIViewController, withInfo info: NSDictionary)
}
open class ContentView: UIScrollView, UIGestureRecognizerDelegate {
open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
guard let wrapperView = NSClassFromString("UITableViewWrapperView"), let otherGestureView = otherGestureRecognizer.view else { return false }
if otherGestureView.isKind(of: wrapperView) && (otherGestureRecognizer is UIPanGestureRecognizer) {
return true
}
return false
}
}
open class PageController: UIViewController, UIScrollViewDelegate, MenuViewDelegate, MenuViewDataSource, PageControllerDelegate, PageControllerDataSource {
// MARK: - Public vars
open weak var dataSource: PageControllerDataSource?
open weak var delegate: PageControllerDelegate?
open var viewControllerClasses: [UIViewController.Type]?
open var titles: [String]?
open var values: NSArray?
open var keys: [String]?
open var progressColor: UIColor?
open var progressHeight: CGFloat = 2.0
open var itemMargin: CGFloat = 0.0
open var menuViewStyle = MenuViewStyle.default
open var titleFontName: String?
open var pageAnimatable = false
open var postNotification = false
open var bounces = false
open var showOnNavigationBar = false
open var startDragging = false
open var titleSizeSelected: CGFloat = 18.0
open var titleSizeNormal: CGFloat = 15.0
open var menuHeight: CGFloat = 30.0
open var menuItemWidth: CGFloat = 65.0
open weak var contentView: ContentView?
open weak var menuView: MenuView?
open var itemsWidths: [CGFloat]?
open fileprivate(set) var currentViewController: UIViewController?
open var selectedIndex: Int {
set {
_selectedIndex = newValue
menuView?.selectItemAtIndex(newValue)
}
get { return _selectedIndex }
}
open var menuViewContentMargin: CGFloat = 0.0 {
didSet {
guard let menu = menuView else { return }
menu.contentMargin = oldValue
}
}
open var viewFrame = CGRect() {
didSet {
if let _ = menuView {
hasInit = false
viewDidLayoutSubviews()
}
}
}
open var itemsMargins: [CGFloat]?
open var preloadPolicy: PreloadPolicy = .never
open var cachePolicy: CachePolicy = .noLimit {
didSet { memCache.countLimit = cachePolicy.rawValue }
}
open lazy var titleColorSelected = UIColor(red: 168.0/255.0, green: 20.0/255.0, blue: 4/255.0, alpha: 1.0)
open lazy var titleColorNormal = UIColor.black
open lazy var menuBGColor = UIColor(red: 244.0/255.0, green: 244.0/255.0, blue: 244.0/255.0, alpha: 1.0)
override open var edgesForExtendedLayout: UIRectEdge {
didSet {
hasInit = false
viewDidLayoutSubviews()
}
}
// MARK: - Private vars
fileprivate var memoryWarningCount = 0
fileprivate var viewHeight: CGFloat = 0.0
fileprivate var viewWidth: CGFloat = 0.0
fileprivate var viewX: CGFloat = 0.0
fileprivate var viewY: CGFloat = 0.0
fileprivate var _selectedIndex = 0
fileprivate var targetX: CGFloat = 0.0
fileprivate var superviewHeight: CGFloat = 0.0
fileprivate var hasInit = false
fileprivate var shouldNotScroll = false
fileprivate var initializedIndex = -1
fileprivate var controllerCount = -1
fileprivate var childControllersCount: Int {
if controllerCount == -1 {
if let count = dataSource?.numberOfControllersInPageController?(self) {
controllerCount = count
} else {
controllerCount = (viewControllerClasses?.count ?? 0)
}
}
return controllerCount
}
lazy fileprivate var displayingControllers = NSMutableDictionary()
lazy fileprivate var memCache = NSCache<NSNumber, UIViewController>()
lazy fileprivate var childViewFrames = [CGRect]()
// MARK: - Life cycle
public convenience init(vcClasses: [UIViewController.Type], theirTitles: [String]) {
self.init()
assert(vcClasses.count == theirTitles.count, "`vcClasses.count` must equal to `titles.count`")
titles = theirTitles
viewControllerClasses = vcClasses
}
override open func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
guard childControllersCount > 0 else { return }
calculateSize()
addScrollView()
addViewControllerAtIndex(_selectedIndex)
currentViewController = displayingControllers[_selectedIndex] as? UIViewController
addMenuView()
}
override open func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
guard childControllersCount > 0 else { return }
let oldSuperviewHeight = superviewHeight
superviewHeight = view.frame.size.height
guard (!hasInit || superviewHeight != oldSuperviewHeight) && (view.window != nil) else { return }
calculateSize()
adjustScrollViewFrame()
adjustMenuViewFrame()
removeSuperfluousViewControllersIfNeeded()
currentViewController?.view.frame = childViewFrames[_selectedIndex]
hasInit = true
view.layoutIfNeeded()
}
override open func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
guard childControllersCount > 0 else { return }
postFullyDisplayedNotificationWithIndex(_selectedIndex)
didEnterController(currentViewController!, atIndex: _selectedIndex)
}
override open func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
memoryWarningCount += 1
cachePolicy = CachePolicy.lowMemory
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(PageController.growCachePolicyAfterMemoryWarning), object: nil)
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(PageController.growCachePolicyToHigh), object: nil)
memCache.removeAllObjects()
if memoryWarningCount < 3 {
perform(#selector(PageController.growCachePolicyAfterMemoryWarning), with: nil, afterDelay: 3.0, inModes: [RunLoopMode.commonModes])
}
}
// MARK: - Reload
open func reloadData() {
clearDatas()
resetScrollView()
memCache.removeAllObjects()
viewDidLayoutSubviews()
resetMenuView()
}
// MARK: - Update Title
open func updateTitle(_ title: String, atIndex index: Int) {
menuView?.updateTitle(title, atIndex: index, andWidth: false)
}
open func updateTitle(_ title: String, atIndex index: Int, andWidth width: CGFloat) {
if var widths = itemsWidths {
guard index < widths.count else { return }
widths[index] = width
itemsWidths = widths
} else {
var widths = [CGFloat]()
for i in 0 ..< childControllersCount {
let newWidth = (i == index) ? width : menuItemWidth
widths.append(newWidth)
}
itemsWidths = widths
}
menuView?.updateTitle(title, atIndex: index, andWidth: true)
}
// MARK: - Data Source
fileprivate func initializeViewControllerAtIndex(_ index: Int) -> UIViewController {
if let viewController = dataSource?.pageController?(self, viewControllerAtIndex: index) {
return viewController
}
return viewControllerClasses![index].init()
}
fileprivate func titleAtIndex(_ index: Int) -> String {
if let titleAtIndex = dataSource?.pageController?(self, titleAtIndex: index) {
return titleAtIndex
}
return titles![index]
}
// MARK: - Delegate
fileprivate func infoWithIndex(_ index: Int) -> NSDictionary {
let title = titleAtIndex(index)
return ["title": title, "index": index]
}
fileprivate func willCachedController(_ vc: UIViewController, atIndex index: Int) {
guard childControllersCount > 0 else { return }
delegate?.pageController?(self, willCachedViewController: vc, withInfo: infoWithIndex(index))
}
fileprivate func willEnterController(_ vc: UIViewController, atIndex index: Int) {
guard childControllersCount > 0 else { return }
delegate?.pageController?(self, willEnterViewController: vc, withInfo: infoWithIndex(index))
}
fileprivate func didEnterController(_ vc: UIViewController, atIndex index: Int) {
guard childControllersCount > 0 else { return }
let info = infoWithIndex(index)
delegate?.pageController?(self, didEnterViewController: vc, withInfo: info)
if initializedIndex == index {
delegate?.pageController?(self, lazyLoadViewController: vc, withInfo: info)
initializedIndex = -1
}
if preloadPolicy == .never { return }
var start = 0
var end = childControllersCount - 1
if index > preloadPolicy.rawValue {
start = index - preloadPolicy.rawValue
}
if childControllersCount - 1 > preloadPolicy.rawValue + index {
end = index + preloadPolicy.rawValue
}
for i in start ... end {
if memCache.object(forKey: NSNumber(integerLiteral: i)) == nil && displayingControllers[i] == nil {
addViewControllerAtIndex(i)
postMovedToSuperViewNotificationWithIndex(i)
}
}
_selectedIndex = index
}
// MARK: - Private funcs
fileprivate func clearDatas() {
controllerCount = -1
hasInit = false
_selectedIndex = _selectedIndex < childControllersCount ? _selectedIndex : childControllersCount - 1
for viewController in displayingControllers.allValues {
if let vc = viewController as? UIViewController {
vc.view.removeFromSuperview()
vc.willMove(toParentViewController: nil)
vc.removeFromParentViewController()
}
}
memoryWarningCount = 0
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(PageController.growCachePolicyAfterMemoryWarning), object: nil)
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(PageController.growCachePolicyToHigh), object: nil)
currentViewController = nil
displayingControllers.removeAllObjects()
calculateSize()
}
fileprivate func resetScrollView() {
contentView?.removeFromSuperview()
addScrollView()
addViewControllerAtIndex(_selectedIndex)
currentViewController = displayingControllers[_selectedIndex] as? UIViewController
}
fileprivate func calculateSize() {
var navBarHeight = (navigationController != nil) ? navigationController!.navigationBar.frame.maxY : 0
let tabBar = tabBarController?.tabBar ?? (navigationController?.toolbar ?? nil)
let height = (tabBar != nil && tabBar?.isHidden != true) ? tabBar!.frame.height : 0
var tabBarHeight = (hidesBottomBarWhenPushed == true) ? 0 : height
let mainWindow = UIApplication.shared.delegate?.window!
let absoluteRect = view.superview?.convert(view.frame, to: mainWindow)
if let rect = absoluteRect {
navBarHeight -= rect.origin.y;
tabBarHeight -= mainWindow!.frame.height - rect.maxY;
}
viewX = viewFrame.origin.x
viewY = viewFrame.origin.y
if viewFrame == CGRect.zero {
viewWidth = view.frame.size.width
viewHeight = view.frame.size.height - menuHeight - navBarHeight - tabBarHeight
viewY += navBarHeight
} else {
viewWidth = viewFrame.size.width
viewHeight = viewFrame.size.height - menuHeight
}
if showOnNavigationBar && (navigationController?.navigationBar != nil) {
viewHeight += menuHeight
}
childViewFrames.removeAll()
for index in 0 ..< childControllersCount {
let viewControllerFrame = CGRect(x: CGFloat(index) * viewWidth, y: 0, width: viewWidth, height: viewHeight)
childViewFrames.append(viewControllerFrame)
}
}
fileprivate func addScrollView() {
let scrollView = ContentView()
scrollView.scrollsToTop = false
scrollView.isPagingEnabled = true
scrollView.delegate = self
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
scrollView.bounces = bounces
view.addSubview(scrollView)
contentView = scrollView
}
fileprivate func addMenuView() {
var menuY = viewY
if showOnNavigationBar && (navigationController?.navigationBar != nil) {
let naviHeight = navigationController!.navigationBar.frame.height
let realMenuHeight = menuHeight > naviHeight ? naviHeight : menuHeight
menuY = (naviHeight - realMenuHeight) / 2
}
let menuViewFrame = CGRect(x: viewX, y: menuY, width: viewWidth, height: menuHeight)
let menu = MenuView(frame: menuViewFrame)
menu.delegate = self
menu.dataSource = self
menu.backgroundColor = menuBGColor
menu.normalSize = titleSizeNormal
menu.selectedSize = titleSizeSelected
menu.normalColor = titleColorNormal
menu.selectedColor = titleColorSelected
menu.style = menuViewStyle
menu.progressHeight = progressHeight
menu.progressColor = progressColor
menu.fontName = titleFontName
menu.contentMargin = menuViewContentMargin
if showOnNavigationBar && (navigationController?.navigationBar != nil) {
navigationItem.titleView = menu
} else {
view.addSubview(menu)
}
menuView = menu
}
fileprivate func postMovedToSuperViewNotificationWithIndex(_ index: Int) {
guard postNotification else { return }
let info = ["index": index, "title": titleAtIndex(index)] as [String : Any]
NotificationCenter.default.post(name: Notification.Name(rawValue: WMPageControllerDidMovedToSuperViewNotification), object: info)
}
fileprivate func postFullyDisplayedNotificationWithIndex(_ index: Int) {
guard postNotification else { return }
let info = ["index": index, "title": titleAtIndex(index)] as [String : Any]
NotificationCenter.default.post(name: Notification.Name(rawValue: WMPageControllerDidFullyDisplayedNotification), object: info)
}
fileprivate func layoutChildViewControllers() {
let currentPage = Int(contentView!.contentOffset.x / viewWidth)
let start = currentPage == 0 ? currentPage : (currentPage - 1)
let end = (currentPage == childControllersCount - 1) ? currentPage : (currentPage + 1)
for index in start ... end {
let viewControllerFrame = childViewFrames[index]
var vc = displayingControllers.object(forKey: index)
if inScreen(viewControllerFrame) {
if vc == nil {
vc = memCache.object(forKey: NSNumber(integerLiteral: index))
if let viewController = vc as? UIViewController {
addCachedViewController(viewController, atIndex: index)
} else {
addViewControllerAtIndex(index)
}
postMovedToSuperViewNotificationWithIndex(index)
}
} else {
if let viewController = vc as? UIViewController {
removeViewController(viewController, atIndex: index)
}
}
}
}
fileprivate func removeSuperfluousViewControllersIfNeeded() {
for (index, vc) in displayingControllers {
let frame = childViewFrames[(index as AnyObject).intValue]
if (inScreen(frame) == false) {
removeViewController(vc as! UIViewController, atIndex: (index as AnyObject).intValue)
}
}
}
fileprivate func addCachedViewController(_ viewController: UIViewController, atIndex index: Int) {
addChildViewController(viewController)
viewController.view.frame = childViewFrames[index]
viewController.didMove(toParentViewController: self)
contentView?.addSubview(viewController.view)
willEnterController(viewController, atIndex: index)
displayingControllers.setObject(viewController, forKey: index as NSCopying)
}
fileprivate func addViewControllerAtIndex(_ index: Int) {
initializedIndex = index
let viewController = initializeViewControllerAtIndex(index)
if let optionalKeys = keys {
viewController.setValue(values?[index], forKey: optionalKeys[index])
}
addChildViewController(viewController)
viewController.view.frame = childViewFrames.count > 0 ? childViewFrames[index] : view.frame
viewController.didMove(toParentViewController: self)
contentView?.addSubview(viewController.view)
willEnterController(viewController, atIndex: index)
displayingControllers.setObject(viewController, forKey: index as NSCopying)
}
fileprivate func removeViewController(_ viewController: UIViewController, atIndex index: Int) {
viewController.view.removeFromSuperview()
viewController.willMove(toParentViewController: nil)
viewController.removeFromParentViewController()
displayingControllers.removeObject(forKey: index)
if memCache.object(forKey: NSNumber(integerLiteral: index)) == nil {
willCachedController(viewController, atIndex: index)
memCache.setObject(viewController, forKey: NSNumber(integerLiteral: index))
}
}
fileprivate func inScreen(_ frame: CGRect) -> Bool {
let x = frame.origin.x
let ScreenWidth = contentView!.frame.size.width
let contentOffsetX = contentView!.contentOffset.x
if (frame.maxX > contentOffsetX) && (x - contentOffsetX < ScreenWidth) {
return true
}
return false
}
fileprivate func resetMenuView() {
if menuView == nil {
addMenuView()
return
}
menuView?.reload()
guard selectedIndex != 0 else { return }
menuView?.selectItemAtIndex(selectedIndex)
view.bringSubview(toFront: menuView!)
}
@objc fileprivate func growCachePolicyAfterMemoryWarning() {
cachePolicy = CachePolicy.balanced
perform(#selector(PageController.growCachePolicyToHigh), with: nil, afterDelay: 2.0, inModes: [RunLoopMode.commonModes])
}
@objc fileprivate func growCachePolicyToHigh() {
cachePolicy = CachePolicy.high
}
// MARK: - Adjust Frame
fileprivate func adjustScrollViewFrame() {
shouldNotScroll = true
var scrollFrame = CGRect(x: viewX, y: viewY + menuHeight, width: viewWidth, height: viewHeight)
scrollFrame.origin.y -= showOnNavigationBar && (navigationController?.navigationBar != nil) ? menuHeight : 0
contentView?.frame = scrollFrame
contentView?.contentSize = CGSize(width: CGFloat(childControllersCount) * viewWidth, height: 0)
contentView?.contentOffset = CGPoint(x: CGFloat(_selectedIndex) * viewWidth, y: 0)
shouldNotScroll = false
}
fileprivate func adjustMenuViewFrame() {
var realMenuHeight = menuHeight
var menuX = viewX
var menuY = viewY
var rightWidth: CGFloat = 0.0
if showOnNavigationBar && (navigationController?.navigationBar != nil) {
for subview in (navigationController?.navigationBar.subviews)! {
guard let UINavigationBarBackgroundClass = NSClassFromString("_UINavigationBarBackground") else {
continue
}
guard !subview.isKind(of: UINavigationBarBackgroundClass) && !subview.isKind(of: MenuView.self) && (subview.alpha != 0) && (subview.isHidden == false) else { continue }
let maxX = subview.frame.maxX
if maxX < viewWidth / 2 {
let leftWidth = maxX
menuX = menuX > leftWidth ? menuX : leftWidth
}
let minX = subview.frame.minX
if minX > viewWidth / 2 {
let width = viewWidth - minX
rightWidth = rightWidth > width ? rightWidth : width
}
}
let naviHeight = navigationController!.navigationBar.frame.height
realMenuHeight = menuHeight > naviHeight ? naviHeight : realMenuHeight
menuY = (naviHeight - realMenuHeight) / 2
}
let menuWidth = viewWidth - menuX - rightWidth
menuView?.frame = CGRect(x: menuX, y: menuY, width: menuWidth, height: realMenuHeight)
menuView?.resetFrames()
if _selectedIndex != 0 {
menuView?.selectItemAtIndex(_selectedIndex)
}
}
// MARK: - UIScrollView Delegate
open func scrollViewDidScroll(_ scrollView: UIScrollView) {
if shouldNotScroll || !hasInit { return }
layoutChildViewControllers()
guard startDragging else { return }
var contentOffsetX = contentView!.contentOffset.x
if contentOffsetX < 0.0 {
contentOffsetX = 0.0
}
if contentOffsetX > (scrollView.contentSize.width - viewWidth) {
contentOffsetX = scrollView.contentSize.width - viewWidth
}
let rate = contentOffsetX / viewWidth
menuView?.slideMenuAtProgress(rate)
if scrollView.contentOffset.y == 0 { return }
var contentOffset = scrollView.contentOffset
contentOffset.y = 0.0
scrollView.contentOffset = contentOffset
}
open func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
startDragging = true
menuView?.isUserInteractionEnabled = false
}
open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
menuView?.isUserInteractionEnabled = true
_selectedIndex = Int(contentView!.contentOffset.x / viewWidth)
removeSuperfluousViewControllersIfNeeded()
currentViewController = displayingControllers[_selectedIndex] as? UIViewController
postFullyDisplayedNotificationWithIndex(_selectedIndex)
didEnterController(currentViewController!, atIndex: _selectedIndex)
}
open func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
_selectedIndex = Int(contentView!.contentOffset.x / viewWidth)
removeSuperfluousViewControllersIfNeeded()
currentViewController = displayingControllers[_selectedIndex] as? UIViewController
postFullyDisplayedNotificationWithIndex(_selectedIndex)
didEnterController(currentViewController!, atIndex: _selectedIndex)
}
open func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
guard decelerate == false else { return }
menuView?.isUserInteractionEnabled = true
let rate = targetX / viewWidth
menuView?.slideMenuAtProgress(rate)
}
open func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
targetX = targetContentOffset.pointee.x
}
// MARK: - MenuViewDelegate
open func menuView(_ menuView: MenuView, didSelectedIndex index: Int, fromIndex currentIndex: Int) {
guard hasInit else { return }
startDragging = false
let targetPoint = CGPoint(x: CGFloat(index) * viewWidth, y: 0)
contentView?.setContentOffset(targetPoint, animated: pageAnimatable)
if !pageAnimatable {
removeSuperfluousViewControllersIfNeeded()
if let viewController = displayingControllers[index] as? UIViewController {
removeViewController(viewController, atIndex: index)
}
layoutChildViewControllers()
currentViewController = displayingControllers[index] as? UIViewController
postFullyDisplayedNotificationWithIndex(index)
_selectedIndex = index
didEnterController(currentViewController!, atIndex: _selectedIndex)
}
}
open func menuView(_ menuView: MenuView, widthForItemAtIndex index: Int) -> CGFloat {
if let widths = itemsWidths {
return widths[index]
}
return menuItemWidth
}
open func menuView(_ menuView: MenuView, itemMarginAtIndex index: Int) -> CGFloat {
if let margins = itemsMargins {
return margins[index]
}
return itemMargin
}
// MARK: - MenuViewDataSource
open func numbersOfTitlesInMenuView(_ menuView: MenuView) -> Int {
return childControllersCount
}
open func menuView(_ menuView: MenuView, titleAtIndex index: Int) -> String {
return titleAtIndex(index)
}
}
================================================
FILE: PageController/ProgressView.swift
================================================
//
// ProgressView.swift
// PageController
//
// Created by Mark on 15/10/20.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
class ProgressView: UIView {
// MARK: - Public vars
var itemFrames = [CGRect]()
var progress: CGFloat = 0.0 {
didSet { setNeedsDisplay() }
}
lazy var color: CGColor = UIColor.brown.cgColor
// MARK: - Private vars
weak fileprivate var link: CADisplayLink?
fileprivate var gap: CGFloat = 0.0
fileprivate var step: CGFloat = 0.0
fileprivate var sign = 1
// MARK: - Public funcs
func moveToPosition(_ position: Int, animation: Bool) {
if animation == false {
progress = CGFloat(position)
return
}
let pos = CGFloat(position)
gap = fabs(progress - pos)
sign = progress > pos ? -1 : 1
step = gap / 15.0
link?.remove(from: RunLoop.main, forMode: RunLoopMode.commonModes)
let tempLink = CADisplayLink(target: self, selector: #selector(ProgressView.progressChanged))
tempLink.add(to: RunLoop.main, forMode: RunLoopMode.commonModes)
link = tempLink
}
func progressChanged() {
if gap > 0.000001 {
gap -= step
if gap < 0.0 {
progress = blurredCeil(progress + CGFloat(sign) * step )
return
}
progress += CGFloat(sign) * step
} else {
progress = blurredCeil(progress)
link?.invalidate()
link = nil
}
}
fileprivate func blurredCeil(_ num: CGFloat) -> CGFloat {
let p = num + 0.5
return floor(p)
}
// MARK: - Private funcs
override func draw(_ rect: CGRect) {
// Drawing code
let ctx = UIGraphicsGetCurrentContext()
let index = Int(progress)
let rate = progress - CGFloat(index)
let currentFrame = itemFrames[index]
let currentWidth = currentFrame.size.width
let nextIndex = (index + 1 < itemFrames.count) ? index + 1 : index
let nextWidth = itemFrames[nextIndex].size.width
let height = frame.size.height
let constY = height / 2
let currentX = currentFrame.origin.x
let nextX = itemFrames[nextIndex].origin.x
let startX = currentX + (nextX - currentX) * rate
let endX = startX + currentWidth + (nextWidth - currentWidth) * rate
ctx?.move(to: CGPoint(x: startX, y: constY))
ctx?.addLine(to: CGPoint(x: endX, y: constY))
ctx?.setLineWidth(height)
ctx?.setStrokeColor(color)
ctx?.strokePath()
}
}
================================================
FILE: README.md
================================================
# WMPageController-Swift
[](https://travis-ci.org/wangmchn/WMPageController-Swift)
[](https://developer.apple.com/iphone/index.action)
[](http://mit-license.org)

[](https://github.com/Carthage/Carthage)
An easy solution to page controllers like NetEase News.(Swift Implementation)<br>
## Objective-C Version
Click here: https://github.com/wangmchn/WMPageController
## How to use
[Objective-C README](https://github.com/wangmchn/WMPageController/blob/master/README.md)
## CocoaPods
```
pod 'WMPageController-Swift', '~> 1.3.3'
```
================================================
FILE: StoryboardExample/StoryboardExample/AppDelegate.swift
================================================
//
// AppDelegate.swift
// StoryboardExample
//
// Created by Mark on 16/1/4.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
self.window?.backgroundColor = .whiteColor()
return true
}
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}
================================================
FILE: StoryboardExample/StoryboardExample/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: StoryboardExample/StoryboardExample/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: StoryboardExample/StoryboardExample/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10116" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="riQ-5R-hbg">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Storyboard Test-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="CustomPageController" customModule="StoryboardExample" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" title="Storyboard Test" id="Ty8-iq-NF6"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="844" y="453"/>
</scene>
<!--View Controller-->
<scene sceneID="u1u-7t-AXR">
<objects>
<viewController storyboardIdentifier="ViewController" id="w6x-mN-PN7" customClass="ViewController" customModule="StoryboardExample" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="b2X-h6-sdH"/>
<viewControllerLayoutGuide type="bottom" id="LAc-ne-R49"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="FDd-Q4-KmZ">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="It is a ViewController from Storyboard" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MyO-h4-dxy">
<rect key="frame" x="157" y="289" width="287" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="MyO-h4-dxy" firstAttribute="centerY" secondItem="FDd-Q4-KmZ" secondAttribute="centerY" id="CHp-7Z-UNP"/>
<constraint firstItem="MyO-h4-dxy" firstAttribute="centerX" secondItem="FDd-Q4-KmZ" secondAttribute="centerX" id="Q6W-hi-wiF"/>
<constraint firstItem="MyO-h4-dxy" firstAttribute="top" secondItem="b2X-h6-sdH" secondAttribute="bottom" constant="269" id="y59-pe-X39"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="NXO-BF-CPZ" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1487" y="209"/>
</scene>
<!--Table View Controller-->
<scene sceneID="flR-sr-zDH">
<objects>
<tableViewController storyboardIdentifier="TableViewController" id="Ca8-j7-wcJ" customClass="TableViewController" customModule="StoryboardExample" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="Kse-Nb-T6z">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<sections/>
<connections>
<outlet property="dataSource" destination="Ca8-j7-wcJ" id="8Lv-l2-gEp"/>
<outlet property="delegate" destination="Ca8-j7-wcJ" id="l7A-FZ-35v"/>
</connections>
</tableView>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="J0n-Dy-9G7" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1487" y="986"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="Izb-KV-RFs">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="riQ-5R-hbg" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="d7C-nr-Dxn">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="lRN-zl-3vj"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="POT-7M-ujc" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="32" y="453"/>
</scene>
</scenes>
</document>
================================================
FILE: StoryboardExample/StoryboardExample/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: StoryboardExample/StoryboardExample/ParentController/CustomPageController.swift
================================================
//
// CustomPageController.swift
// StoryboardExample
//
// Created by Mark on 16/1/4.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import UIKit
class CustomPageController: PageController {
var vcTitles = ["use", "storyboard", "xib"]
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
dataSource = self
delegate = self
preloadPolicy = PreloadPolicy.Neighbour
menuViewContentMargin = 10
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
menuView?.leftView = customButtonWithTitle("Left")
menuView?.rightView = customButtonWithTitle("Right")
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.vcTitles = ["Test", "Test", "Test", "Test", "Test", "Test"]
self.reloadData()
}
}
private func customButtonWithTitle(title: String) -> UIButton {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 60, height: menuHeight))
button.addTarget(self, action: #selector(CustomPageController.buttonPressed(_:)), forControlEvents: UIControlEvents.TouchUpInside)
button.setTitle(title, forState: UIControlState.Normal)
button.setTitleColor(.blueColor(), forState: UIControlState.Normal)
return button
}
@objc private func buttonPressed(sender: UIButton) {
print(sender)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - PageController DataSource
func numberOfControllersInPageController(pageController: PageController) -> Int {
return vcTitles.count
}
func pageController(pageController: PageController, titleAtIndex index: Int) -> String {
return vcTitles[index]
}
func pageController(pageController: PageController, viewControllerAtIndex index: Int) -> UIViewController {
let sb = UIStoryboard(name: "Main", bundle: nil)
switch index {
case 0: return sb.instantiateViewControllerWithIdentifier("ViewController")
case 1: return sb.instantiateViewControllerWithIdentifier("TableViewController")
default: return UIViewController()
}
}
func pageController(pageController: PageController, lazyLoadViewController viewController: UIViewController, withInfo info: NSDictionary) {
print(info)
}
override func menuView(menuView: MenuView, widthForItemAtIndex index: Int) -> CGFloat {
if index == 1 {
return 100
}
return 60
}
}
================================================
FILE: StoryboardExample/StoryboardExample/TableViewController.swift
================================================
//
// TableViewController.swift
// StoryboardExample
//
// Created by Mark on 16/1/4.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import UIKit
class TableViewController: UITableViewController {
let reuseIdentifier = "reuseIdentifier"
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: reuseIdentifier)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath)
cell.textLabel?.text = "This is a TableViewController from Storyboard"
cell.textLabel?.font = UIFont.systemFontOfSize(15)
return cell
}
}
================================================
FILE: StoryboardExample/StoryboardExample/ViewController.swift
================================================
//
// ViewController.swift
// StoryboardExample
//
// Created by Mark on 16/1/4.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
================================================
FILE: StoryboardExample/StoryboardExample.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
4DCCF83D1CE8558A00C31A07 /* FooldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8381CE8558A00C31A07 /* FooldView.swift */; };
4DCCF83E1CE8558A00C31A07 /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8391CE8558A00C31A07 /* MenuItem.swift */; };
4DCCF83F1CE8558A00C31A07 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF83A1CE8558A00C31A07 /* MenuView.swift */; };
4DCCF8401CE8558A00C31A07 /* PageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF83B1CE8558A00C31A07 /* PageController.swift */; };
4DCCF8411CE8558A00C31A07 /* ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF83C1CE8558A00C31A07 /* ProgressView.swift */; };
4DF0A9781C39847100731373 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0A9771C39847100731373 /* AppDelegate.swift */; };
4DF0A97A1C39847100731373 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0A9791C39847100731373 /* ViewController.swift */; };
4DF0A97D1C39847100731373 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4DF0A97B1C39847100731373 /* Main.storyboard */; };
4DF0A97F1C39847100731373 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4DF0A97E1C39847100731373 /* Assets.xcassets */; };
4DF0A9821C39847100731373 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4DF0A9801C39847100731373 /* LaunchScreen.storyboard */; };
4DF0A98D1C39847100731373 /* StoryboardExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0A98C1C39847100731373 /* StoryboardExampleTests.swift */; };
4DF0A9981C39847100731373 /* StoryboardExampleUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0A9971C39847100731373 /* StoryboardExampleUITests.swift */; };
4DF0A9B21C3984EB00731373 /* CustomPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0A9B11C3984EB00731373 /* CustomPageController.swift */; };
4DF0A9B51C3986D600731373 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0A9B41C3986D600731373 /* TableViewController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
4DF0A9891C39847100731373 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4DF0A96C1C39847100731373 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4DF0A9731C39847100731373;
remoteInfo = StoryboardExample;
};
4DF0A9941C39847100731373 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4DF0A96C1C39847100731373 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4DF0A9731C39847100731373;
remoteInfo = StoryboardExample;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
4DCCF8381CE8558A00C31A07 /* FooldView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FooldView.swift; sourceTree = "<group>"; };
4DCCF8391CE8558A00C31A07 /* MenuItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = "<group>"; };
4DCCF83A1CE8558A00C31A07 /* MenuView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
4DCCF83B1CE8558A00C31A07 /* PageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageController.swift; sourceTree = "<group>"; };
4DCCF83C1CE8558A00C31A07 /* ProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressView.swift; sourceTree = "<group>"; };
4DF0A9741C39847100731373 /* StoryboardExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StoryboardExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
4DF0A9771C39847100731373 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
4DF0A9791C39847100731373 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
4DF0A97C1C39847100731373 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
4DF0A97E1C39847100731373 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
4DF0A9811C39847100731373 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
4DF0A9831C39847100731373 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4DF0A9881C39847100731373 /* StoryboardExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StoryboardExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
4DF0A98C1C39847100731373 /* StoryboardExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryboardExampleTests.swift; sourceTree = "<group>"; };
4DF0A98E1C39847100731373 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4DF0A9931C39847100731373 /* StoryboardExampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StoryboardExampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
4DF0A9971C39847100731373 /* StoryboardExampleUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryboardExampleUITests.swift; sourceTree = "<group>"; };
4DF0A9991C39847100731373 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4DF0A9B11C3984EB00731373 /* CustomPageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CustomPageController.swift; path = ParentController/CustomPageController.swift; sourceTree = "<group>"; };
4DF0A9B41C3986D600731373 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
4DF0A9711C39847100731373 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4DF0A9851C39847100731373 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4DF0A9901C39847100731373 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
4DCCF8371CE8558A00C31A07 /* PageController */ = {
isa = PBXGroup;
children = (
4DCCF8381CE8558A00C31A07 /* FooldView.swift */,
4DCCF8391CE8558A00C31A07 /* MenuItem.swift */,
4DCCF83A1CE8558A00C31A07 /* MenuView.swift */,
4DCCF83B1CE8558A00C31A07 /* PageController.swift */,
4DCCF83C1CE8558A00C31A07 /* ProgressView.swift */,
);
name = PageController;
path = ../../PageController;
sourceTree = "<group>";
};
4DF0A96B1C39847100731373 = {
isa = PBXGroup;
children = (
4DF0A9761C39847100731373 /* StoryboardExample */,
4DF0A98B1C39847100731373 /* StoryboardExampleTests */,
4DF0A9961C39847100731373 /* StoryboardExampleUITests */,
4DF0A9751C39847100731373 /* Products */,
);
sourceTree = "<group>";
};
4DF0A9751C39847100731373 /* Products */ = {
isa = PBXGroup;
children = (
4DF0A9741C39847100731373 /* StoryboardExample.app */,
4DF0A9881C39847100731373 /* StoryboardExampleTests.xctest */,
4DF0A9931C39847100731373 /* StoryboardExampleUITests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
4DF0A9761C39847100731373 /* StoryboardExample */ = {
isa = PBXGroup;
children = (
4DCCF8371CE8558A00C31A07 /* PageController */,
4DF0A9B31C3986B800731373 /* ChildControllers */,
4DF0A9B01C3984BA00731373 /* ParentController */,
4DF0A9771C39847100731373 /* AppDelegate.swift */,
4DF0A97B1C39847100731373 /* Main.storyboard */,
4DF0A97E1C39847100731373 /* Assets.xcassets */,
4DF0A9801C39847100731373 /* LaunchScreen.storyboard */,
4DF0A9831C39847100731373 /* Info.plist */,
);
path = StoryboardExample;
sourceTree = "<group>";
};
4DF0A98B1C39847100731373 /* StoryboardExampleTests */ = {
isa = PBXGroup;
children = (
4DF0A98C1C39847100731373 /* StoryboardExampleTests.swift */,
4DF0A98E1C39847100731373 /* Info.plist */,
);
path = StoryboardExampleTests;
sourceTree = "<group>";
};
4DF0A9961C39847100731373 /* StoryboardExampleUITests */ = {
isa = PBXGroup;
children = (
4DF0A9971C39847100731373 /* StoryboardExampleUITests.swift */,
4DF0A9991C39847100731373 /* Info.plist */,
);
path = StoryboardExampleUITests;
sourceTree = "<group>";
};
4DF0A9B01C3984BA00731373 /* ParentController */ = {
isa = PBXGroup;
children = (
4DF0A9B11C3984EB00731373 /* CustomPageController.swift */,
);
name = ParentController;
sourceTree = "<group>";
};
4DF0A9B31C3986B800731373 /* ChildControllers */ = {
isa = PBXGroup;
children = (
4DF0A9791C39847100731373 /* ViewController.swift */,
4DF0A9B41C3986D600731373 /* TableViewController.swift */,
);
name = ChildControllers;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
4DF0A9731C39847100731373 /* StoryboardExample */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4DF0A99C1C39847100731373 /* Build configuration list for PBXNativeTarget "StoryboardExample" */;
buildPhases = (
4DF0A9701C39847100731373 /* Sources */,
4DF0A9711C39847100731373 /* Frameworks */,
4DF0A9721C39847100731373 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = StoryboardExample;
productName = StoryboardExample;
productReference = 4DF0A9741C39847100731373 /* StoryboardExample.app */;
productType = "com.apple.product-type.application";
};
4DF0A9871C39847100731373 /* StoryboardExampleTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4DF0A99F1C39847100731373 /* Build configuration list for PBXNativeTarget "StoryboardExampleTests" */;
buildPhases = (
4DF0A9841C39847100731373 /* Sources */,
4DF0A9851C39847100731373 /* Frameworks */,
4DF0A9861C39847100731373 /* Resources */,
);
buildRules = (
);
dependencies = (
4DF0A98A1C39847100731373 /* PBXTargetDependency */,
);
name = StoryboardExampleTests;
productName = StoryboardExampleTests;
productReference = 4DF0A9881C39847100731373 /* StoryboardExampleTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
4DF0A9921C39847100731373 /* StoryboardExampleUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4DF0A9A21C39847100731373 /* Build configuration list for PBXNativeTarget "StoryboardExampleUITests" */;
buildPhases = (
4DF0A98F1C39847100731373 /* Sources */,
4DF0A9901C39847100731373 /* Frameworks */,
4DF0A9911C39847100731373 /* Resources */,
);
buildRules = (
);
dependencies = (
4DF0A9951C39847100731373 /* PBXTargetDependency */,
);
name = StoryboardExampleUITests;
productName = StoryboardExampleUITests;
productReference = 4DF0A9931C39847100731373 /* StoryboardExampleUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
4DF0A96C1C39847100731373 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0720;
LastUpgradeCheck = 0720;
ORGANIZATIONNAME = "Wecan Studio";
TargetAttributes = {
4DF0A9731C39847100731373 = {
CreatedOnToolsVersion = 7.2;
};
4DF0A9871C39847100731373 = {
CreatedOnToolsVersion = 7.2;
TestTargetID = 4DF0A9731C39847100731373;
};
4DF0A9921C39847100731373 = {
CreatedOnToolsVersion = 7.2;
TestTargetID = 4DF0A9731C39847100731373;
};
};
};
buildConfigurationList = 4DF0A96F1C39847100731373 /* Build configuration list for PBXProject "StoryboardExample" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 4DF0A96B1C39847100731373;
productRefGroup = 4DF0A9751C39847100731373 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
4DF0A9731C39847100731373 /* StoryboardExample */,
4DF0A9871C39847100731373 /* StoryboardExampleTests */,
4DF0A9921C39847100731373 /* StoryboardExampleUITests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
4DF0A9721C39847100731373 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4DF0A9821C39847100731373 /* LaunchScreen.storyboard in Resources */,
4DF0A97F1C39847100731373 /* Assets.xcassets in Resources */,
4DF0A97D1C39847100731373 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4DF0A9861C39847100731373 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4DF0A9911C39847100731373 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
4DF0A9701C39847100731373 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4DCCF83F1CE8558A00C31A07 /* MenuView.swift in Sources */,
4DF0A9B21C3984EB00731373 /* CustomPageController.swift in Sources */,
4DCCF83D1CE8558A00C31A07 /* FooldView.swift in Sources */,
4DCCF8401CE8558A00C31A07 /* PageController.swift in Sources */,
4DF0A97A1C39847100731373 /* ViewController.swift in Sources */,
4DF0A9B51C3986D600731373 /* TableViewController.swift in Sources */,
4DCCF83E1CE8558A00C31A07 /* MenuItem.swift in Sources */,
4DCCF8411CE8558A00C31A07 /* ProgressView.swift in Sources */,
4DF0A9781C39847100731373 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4DF0A9841C39847100731373 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4DF0A98D1C39847100731373 /* StoryboardExampleTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4DF0A98F1C39847100731373 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4DF0A9981C39847100731373 /* StoryboardExampleUITests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
4DF0A98A1C39847100731373 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4DF0A9731C39847100731373 /* StoryboardExample */;
targetProxy = 4DF0A9891C39847100731373 /* PBXContainerItemProxy */;
};
4DF0A9951C39847100731373 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4DF0A9731C39847100731373 /* StoryboardExample */;
targetProxy = 4DF0A9941C39847100731373 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
4DF0A97B1C39847100731373 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
4DF0A97C1C39847100731373 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
4DF0A9801C39847100731373 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
4DF0A9811C39847100731373 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
4DF0A99A1C39847100731373 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
4DF0A99B1C39847100731373 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
4DF0A99D1C39847100731373 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = StoryboardExample/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.StoryboardExample;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
4DF0A99E1C39847100731373 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = StoryboardExample/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.StoryboardExample;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
4DF0A9A01C39847100731373 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
INFOPLIST_FILE = StoryboardExampleTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.StoryboardExampleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StoryboardExample.app/StoryboardExample";
};
name = Debug;
};
4DF0A9A11C39847100731373 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
INFOPLIST_FILE = StoryboardExampleTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.StoryboardExampleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StoryboardExample.app/StoryboardExample";
};
name = Release;
};
4DF0A9A31C39847100731373 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = StoryboardExampleUITests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.StoryboardExampleUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_TARGET_NAME = StoryboardExample;
USES_XCTRUNNER = YES;
};
name = Debug;
};
4DF0A9A41C39847100731373 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = StoryboardExampleUITests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.StoryboardExampleUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_TARGET_NAME = StoryboardExample;
USES_XCTRUNNER = YES;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4DF0A96F1C39847100731373 /* Build configuration list for PBXProject "StoryboardExample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4DF0A99A1C39847100731373 /* Debug */,
4DF0A99B1C39847100731373 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4DF0A99C1C39847100731373 /* Build configuration list for PBXNativeTarget "StoryboardExample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4DF0A99D1C39847100731373 /* Debug */,
4DF0A99E1C39847100731373 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4DF0A99F1C39847100731373 /* Build configuration list for PBXNativeTarget "StoryboardExampleTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4DF0A9A01C39847100731373 /* Debug */,
4DF0A9A11C39847100731373 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4DF0A9A21C39847100731373 /* Build configuration list for PBXNativeTarget "StoryboardExampleUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4DF0A9A31C39847100731373 /* Debug */,
4DF0A9A41C39847100731373 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 4DF0A96C1C39847100731373 /* Project object */;
}
================================================
FILE: StoryboardExample/StoryboardExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:StoryboardExample.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: StoryboardExample/StoryboardExample.xcodeproj/xcshareddata/xcschemes/StoryboardExample.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0720"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4DF0A9731C39847100731373"
BuildableName = "StoryboardExample.app"
BlueprintName = "StoryboardExample"
ReferencedContainer = "container:StoryboardExample.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4DF0A9871C39847100731373"
BuildableName = "StoryboardExampleTests.xctest"
BlueprintName = "StoryboardExampleTests"
ReferencedContainer = "container:StoryboardExample.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4DF0A9921C39847100731373"
BuildableName = "StoryboardExampleUITests.xctest"
BlueprintName = "StoryboardExampleUITests"
ReferencedContainer = "container:StoryboardExample.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4DF0A9731C39847100731373"
BuildableName = "StoryboardExample.app"
BlueprintName = "StoryboardExample"
ReferencedContainer = "container:StoryboardExample.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4DF0A9731C39847100731373"
BuildableName = "StoryboardExample.app"
BlueprintName = "StoryboardExample"
ReferencedContainer = "container:StoryboardExample.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4DF0A9731C39847100731373"
BuildableName = "StoryboardExample.app"
BlueprintName = "StoryboardExample"
ReferencedContainer = "container:StoryboardExample.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: StoryboardExample/StoryboardExampleTests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: StoryboardExample/StoryboardExampleTests/StoryboardExampleTests.swift
================================================
//
// StoryboardExampleTests.swift
// StoryboardExampleTests
//
// Created by Mark on 16/1/4.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import XCTest
@testable import StoryboardExample
class StoryboardExampleTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock {
// Put the code you want to measure the time of here.
}
}
}
================================================
FILE: StoryboardExample/StoryboardExampleUITests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: StoryboardExample/StoryboardExampleUITests/StoryboardExampleUITests.swift
================================================
//
// StoryboardExampleUITests.swift
// StoryboardExampleUITests
//
// Created by Mark on 16/1/4.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import XCTest
class StoryboardExampleUITests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
XCUIApplication().launch()
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// Use recording to get started writing UI tests.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
}
================================================
FILE: WMPageController-Swift/AppDelegate.swift
================================================
//
// AppDelegate.swift
// Example
//
// Created by Mark on 15/12/1.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let pageController = customedPageController()
window?.rootViewController = UINavigationController(rootViewController: pageController)
// reloadPageController(pageController, afterDelay: 5.0)
// updatePageController(pageController, title: "hahahahaha", afterDelay: 5.0)
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
// MARK: - An example of `PageController`
fileprivate func customedPageController() -> PageController {
let vcClasses: [UIViewController.Type] = [ViewController.self, TableViewController.self]
let titles = ["Hello", "World"]
let pageController = PageController(vcClasses: vcClasses, theirTitles: titles)
pageController.pageAnimatable = true
pageController.menuViewStyle = MenuViewStyle.line
pageController.bounces = true
pageController.menuHeight = 44
pageController.titleSizeSelected = 15
pageController.values = ["Hello", "I'm Mark"] // pass values
pageController.keys = ["type", "text"] // keys
pageController.title = "Test"
pageController.menuBGColor = .clear
pageController.showOnNavigationBar = true
// pageController.selectedIndex = 1
// pageController.progressColor = .blackColor()
// pageController.viewFrame = CGRect(x: 50, y: 100, width: 320, height: 500)
// pageController.itemsWidths = [100, 50]
// pageController.itemsMargins = [100, 10, 100]
// pageController.titleSizeNormal = 12
// pageController.titleSizeSelected = 14
// pageController.titleColorNormal = UIColor.brownColor()
// pageController.titleColorSelected = UIColor.blackColor()
return pageController
}
fileprivate func reloadPageController(_ pageController: PageController, afterDelay delay: TimeInterval) {
let delayTime = DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delayTime) {
pageController.titles = ["Hello", "World", "Reload"]
pageController.viewControllerClasses = [ViewController.self, TableViewController.self, ViewController.self]
pageController.values = ["Hello", "I'm Mark", "Reload"]
pageController.keys = ["type", "text", "type"]
pageController.reloadData()
}
}
fileprivate func updatePageController(_ pageController: PageController, title: String, afterDelay delay: TimeInterval) {
let delayTime = DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delayTime) {
pageController.updateTitle(title, atIndex: 1, andWidth: 150)
}
}
}
================================================
FILE: WMPageController-Swift/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: WMPageController-Swift/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: WMPageController-Swift/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
================================================
FILE: WMPageController-Swift/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: WMPageController-Swift/TableViewController.swift
================================================
//
// TableViewController.swift
// PageController
//
// Created by Mark on 15/10/31.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
class TableViewController: UITableViewController {
var text = ""
fileprivate let cellReuseIdentifier = "cellReuseIdentifier"
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
tableView.rowHeight = 60
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
cell.selectionStyle = UITableViewCellSelectionStyle.none
cell.imageView?.image = UIImage(named: "github")
cell.textLabel?.text = text
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// let vc = ViewController()
let vc = customedPageController()
vc.title = "Push"
// vc.type = "Bye bye"
navigationController?.pushViewController(vc, animated: true)
}
// MARK: - An example of `PageController`
fileprivate func customedPageController() -> PageController {
let vcClasses: [UIViewController.Type] = [ViewController.self, TableViewController.self]
let titles = ["Hello", "World"]
let pageController = PageController(vcClasses: vcClasses, theirTitles: titles)
pageController.pageAnimatable = true
pageController.menuViewStyle = MenuViewStyle.line
pageController.bounces = true
pageController.menuHeight = 44
pageController.titleSizeSelected = 15
pageController.values = ["Hello", "I'm Mark"] // pass values
pageController.keys = ["type", "text"] // keys
pageController.title = "Test"
pageController.menuBGColor = .clear
// pageController.selectedIndex = 1
// pageController.progressColor = .blackColor()
// pageController.viewFrame = CGRect(x: 50, y: 100, width: 320, height: 500)
// pageController.itemsWidths = [100, 50]
// pageController.itemsMargins = [50, 10, 100]
// pageController.titleSizeNormal = 12
// pageController.titleSizeSelected = 14
// pageController.titleColorNormal = UIColor.brownColor()
// pageController.titleColorSelected = UIColor.blackColor()
return pageController
}
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if (indexPath as NSIndexPath).row % 2 == 0 {
return true
}
return false
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
}
}
================================================
FILE: WMPageController-Swift/ViewController.swift
================================================
//
// ViewController.swift
// PageController
//
// Created by Mark on 15/10/20.
// Copyright © 2015年 Wecan Studio. All rights reserved.
//
import UIKit
class ViewController: UIViewController, UITableViewDelegate {
var type = ""
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
createLabel()
}
fileprivate func createLabel() {
let label = UILabel(frame: CGRect(x: 0, y: 100, width: view.bounds.size.width, height: 100))
label.text = type
label.font = UIFont.systemFont(ofSize: 22)
label.textAlignment = .center
view.addSubview(label)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
================================================
FILE: WMPageController-Swift.podspec
================================================
Pod::Spec.new do |s|
s.name = "WMPageController-Swift"
s.version = "1.4.0"
s.summary = "An easy solution to page controllers like NetEase News.(Swift Implementation)"
s.homepage = "https://github.com/wangmchn/WMPageController-Swift"
s.license = 'MIT (LICENSE)'
s.author = { "wangmchn" => "wangmchn@163.com" }
s.source = { :git => "https://github.com/wangmchn/WMPageController-Swift.git", :tag => "1.4.0" }
s.platform = :ios, '8.0'
s.source_files = 'PageController', 'PageController/**/*.{swift}'
s.exclude_files = 'Example'
s.frameworks = 'Foundation', 'CoreGraphics', 'UIKit'
s.requires_arc = true
end
================================================
FILE: WMPageController-Swift.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
4D45BF191CC7A10B003F0151 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D45BF181CC7A10B003F0151 /* AppDelegate.swift */; };
4D45BF1B1CC7A10B003F0151 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D45BF1A1CC7A10B003F0151 /* ViewController.swift */; };
4D45BF1E1CC7A10B003F0151 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4D45BF1C1CC7A10B003F0151 /* Main.storyboard */; };
4D45BF201CC7A10B003F0151 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4D45BF1F1CC7A10B003F0151 /* Assets.xcassets */; };
4D45BF231CC7A10B003F0151 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4D45BF211CC7A10B003F0151 /* LaunchScreen.storyboard */; };
4D45BF2E1CC7A10B003F0151 /* WMPageController_SwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D45BF2D1CC7A10B003F0151 /* WMPageController_SwiftTests.swift */; };
4D45BF391CC7A10B003F0151 /* WMPageController_SwiftUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D45BF381CC7A10B003F0151 /* WMPageController_SwiftUITests.swift */; };
4D45BF521CC7A1EB003F0151 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D45BF511CC7A1EB003F0151 /* TableViewController.swift */; };
4D45BF661CC7BC12003F0151 /* WMPageControllerSwiftFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D45BF651CC7BC12003F0151 /* WMPageControllerSwiftFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
4D45BF6A1CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D45BF631CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework */; };
4D45BF6B1CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4D45BF631CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4DCCF8481CE855F200C31A07 /* FloodView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8431CE855F200C31A07 /* FloodView.swift */; };
4DCCF8491CE855F200C31A07 /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8441CE855F200C31A07 /* MenuItem.swift */; };
4DCCF84A1CE855F200C31A07 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8451CE855F200C31A07 /* MenuView.swift */; };
4DCCF84B1CE855F200C31A07 /* PageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8461CE855F200C31A07 /* PageController.swift */; };
4DCCF84C1CE855F200C31A07 /* ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8471CE855F200C31A07 /* ProgressView.swift */; };
F73DD37B1F403F3500FAC00A /* FloodView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8431CE855F200C31A07 /* FloodView.swift */; };
F73DD37C1F403F3500FAC00A /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8441CE855F200C31A07 /* MenuItem.swift */; };
F73DD37D1F403F3500FAC00A /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8451CE855F200C31A07 /* MenuView.swift */; };
F73DD37E1F403F3500FAC00A /* PageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8461CE855F200C31A07 /* PageController.swift */; };
F73DD37F1F403F3500FAC00A /* ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCF8471CE855F200C31A07 /* ProgressView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
4D45BF2A1CC7A10B003F0151 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4D45BF0D1CC7A10B003F0151 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4D45BF141CC7A10B003F0151;
remoteInfo = "WMPageController-Swift";
};
4D45BF351CC7A10B003F0151 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4D45BF0D1CC7A10B003F0151 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4D45BF141CC7A10B003F0151;
remoteInfo = "WMPageController-Swift";
};
4D45BF681CC7BC12003F0151 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4D45BF0D1CC7A10B003F0151 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4D45BF621CC7BC12003F0151;
remoteInfo = WMPageControllerSwiftFramework;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
4D45BF6F1CC7BC12003F0151 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
4D45BF6B1CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
4D45BF151CC7A10B003F0151 /* WMPageController-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "WMPageController-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; };
4D45BF181CC7A10B003F0151 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
4D45BF1A1CC7A10B003F0151 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
4D45BF1D1CC7A10B003F0151 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
4D45BF1F1CC7A10B003F0151 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
4D45BF221CC7A10B003F0151 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
4D45BF241CC7A10B003F0151 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4D45BF291CC7A10B003F0151 /* WMPageController-SwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "WMPageController-SwiftTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
4D45BF2D1CC7A10B003F0151 /* WMPageController_SwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WMPageController_SwiftTests.swift; sourceTree = "<group>"; };
4D45BF2F1CC7A10B003F0151 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4D45BF341CC7A10B003F0151 /* WMPageController-SwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "WMPageController-SwiftUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
4D45BF381CC7A10B003F0151 /* WMPageController_SwiftUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WMPageController_SwiftUITests.swift; sourceTree = "<group>"; };
4D45BF3A1CC7A10B003F0151 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4D45BF511CC7A1EB003F0151 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
4D45BF631CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WMPageControllerSwiftFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4D45BF651CC7BC12003F0151 /* WMPageControllerSwiftFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMPageControllerSwiftFramework.h; sourceTree = "<group>"; };
4D45BF671CC7BC12003F0151 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4DCCF8431CE855F200C31A07 /* FloodView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloodView.swift; sourceTree = "<group>"; };
4DCCF8441CE855F200C31A07 /* MenuItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = "<group>"; };
4DCCF8451CE855F200C31A07 /* MenuView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
4DCCF8461CE855F200C31A07 /* PageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageController.swift; sourceTree = "<group>"; };
4DCCF8471CE855F200C31A07 /* ProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
4D45BF121CC7A10B003F0151 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4D45BF6A1CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF261CC7A10B003F0151 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF311CC7A10B003F0151 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF5F1CC7BC12003F0151 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
4D45BF0C1CC7A10B003F0151 = {
isa = PBXGroup;
children = (
4D45BF171CC7A10B003F0151 /* WMPageController-Swift */,
4D45BF2C1CC7A10B003F0151 /* WMPageController-SwiftTests */,
4D45BF371CC7A10B003F0151 /* WMPageController-SwiftUITests */,
4D45BF641CC7BC12003F0151 /* WMPageControllerSwiftFramework */,
4D45BF161CC7A10B003F0151 /* Products */,
);
sourceTree = "<group>";
};
4D45BF161CC7A10B003F0151 /* Products */ = {
isa = PBXGroup;
children = (
4D45BF151CC7A10B003F0151 /* WMPageController-Swift.app */,
4D45BF291CC7A10B003F0151 /* WMPageController-SwiftTests.xctest */,
4D45BF341CC7A10B003F0151 /* WMPageController-SwiftUITests.xctest */,
4D45BF631CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework */,
);
name = Products;
sourceTree = "<group>";
};
4D45BF171CC7A10B003F0151 /* WMPageController-Swift */ = {
isa = PBXGroup;
children = (
4DCCF8421CE855F200C31A07 /* PageController */,
4D45BF181CC7A10B003F0151 /* AppDelegate.swift */,
4D45BF1A1CC7A10B003F0151 /* ViewController.swift */,
4D45BF511CC7A1EB003F0151 /* TableViewController.swift */,
4D45BF1C1CC7A10B003F0151 /* Main.storyboard */,
4D45BF1F1CC7A10B003F0151 /* Assets.xcassets */,
4D45BF211CC7A10B003F0151 /* LaunchScreen.storyboard */,
4D45BF241CC7A10B003F0151 /* Info.plist */,
);
path = "WMPageController-Swift";
sourceTree = "<group>";
};
4D45BF2C1CC7A10B003F0151 /* WMPageController-SwiftTests */ = {
isa = PBXGroup;
children = (
4D45BF2D1CC7A10B003F0151 /* WMPageController_SwiftTests.swift */,
4D45BF2F1CC7A10B003F0151 /* Info.plist */,
);
path = "WMPageController-SwiftTests";
sourceTree = "<group>";
};
4D45BF371CC7A10B003F0151 /* WMPageController-SwiftUITests */ = {
isa = PBXGroup;
children = (
4D45BF381CC7A10B003F0151 /* WMPageController_SwiftUITests.swift */,
4D45BF3A1CC7A10B003F0151 /* Info.plist */,
);
path = "WMPageController-SwiftUITests";
sourceTree = "<group>";
};
4D45BF641CC7BC12003F0151 /* WMPageControllerSwiftFramework */ = {
isa = PBXGroup;
children = (
4D45BF651CC7BC12003F0151 /* WMPageControllerSwiftFramework.h */,
4D45BF671CC7BC12003F0151 /* Info.plist */,
);
path = WMPageControllerSwiftFramework;
sourceTree = "<group>";
};
4DCCF8421CE855F200C31A07 /* PageController */ = {
isa = PBXGroup;
children = (
4DCCF8431CE855F200C31A07 /* FloodView.swift */,
4DCCF8441CE855F200C31A07 /* MenuItem.swift */,
4DCCF8451CE855F200C31A07 /* MenuView.swift */,
4DCCF8461CE855F200C31A07 /* PageController.swift */,
4DCCF8471CE855F200C31A07 /* ProgressView.swift */,
);
path = PageController;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
4D45BF601CC7BC12003F0151 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
4D45BF661CC7BC12003F0151 /* WMPageControllerSwiftFramework.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
4D45BF141CC7A10B003F0151 /* WMPageController-Swift */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4D45BF3D1CC7A10B003F0151 /* Build configuration list for PBXNativeTarget "WMPageController-Swift" */;
buildPhases = (
4D45BF111CC7A10B003F0151 /* Sources */,
4D45BF121CC7A10B003F0151 /* Frameworks */,
4D45BF131CC7A10B003F0151 /* Resources */,
4D45BF6F1CC7BC12003F0151 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
4D45BF691CC7BC12003F0151 /* PBXTargetDependency */,
);
name = "WMPageController-Swift";
productName = "WMPageController-Swift";
productReference = 4D45BF151CC7A10B003F0151 /* WMPageController-Swift.app */;
productType = "com.apple.product-type.application";
};
4D45BF281CC7A10B003F0151 /* WMPageController-SwiftTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4D45BF401CC7A10B003F0151 /* Build configuration list for PBXNativeTarget "WMPageController-SwiftTests" */;
buildPhases = (
4D45BF251CC7A10B003F0151 /* Sources */,
4D45BF261CC7A10B003F0151 /* Frameworks */,
4D45BF271CC7A10B003F0151 /* Resources */,
);
buildRules = (
);
dependencies = (
4D45BF2B1CC7A10B003F0151 /* PBXTargetDependency */,
);
name = "WMPageController-SwiftTests";
productName = "WMPageController-SwiftTests";
productReference = 4D45BF291CC7A10B003F0151 /* WMPageController-SwiftTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
4D45BF331CC7A10B003F0151 /* WMPageController-SwiftUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4D45BF431CC7A10B003F0151 /* Build configuration list for PBXNativeTarget "WMPageController-SwiftUITests" */;
buildPhases = (
4D45BF301CC7A10B003F0151 /* Sources */,
4D45BF311CC7A10B003F0151 /* Frameworks */,
4D45BF321CC7A10B003F0151 /* Resources */,
);
buildRules = (
);
dependencies = (
4D45BF361CC7A10B003F0151 /* PBXTargetDependency */,
);
name = "WMPageController-SwiftUITests";
productName = "WMPageController-SwiftUITests";
productReference = 4D45BF341CC7A10B003F0151 /* WMPageController-SwiftUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
4D45BF621CC7BC12003F0151 /* WMPageControllerSwiftFramework */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4D45BF6E1CC7BC12003F0151 /* Build configuration list for PBXNativeTarget "WMPageControllerSwiftFramework" */;
buildPhases = (
4D45BF5E1CC7BC12003F0151 /* Sources */,
4D45BF5F1CC7BC12003F0151 /* Frameworks */,
4D45BF601CC7BC12003F0151 /* Headers */,
4D45BF611CC7BC12003F0151 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = WMPageControllerSwiftFramework;
productName = WMPageControllerSwiftFramework;
productReference = 4D45BF631CC7BC12003F0151 /* WMPageControllerSwiftFramework.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
4D45BF0D1CC7A10B003F0151 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0730;
LastUpgradeCheck = 0830;
ORGANIZATIONNAME = "Wecan Studio";
TargetAttributes = {
4D45BF141CC7A10B003F0151 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 0800;
};
4D45BF281CC7A10B003F0151 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 0800;
TestTargetID = 4D45BF141CC7A10B003F0151;
};
4D45BF331CC7A10B003F0151 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 0800;
TestTargetID = 4D45BF141CC7A10B003F0151;
};
4D45BF621CC7BC12003F0151 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 0830;
};
};
};
buildConfigurationList = 4D45BF101CC7A10B003F0151 /* Build configuration list for PBXProject "WMPageController-Swift" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 4D45BF0C1CC7A10B003F0151;
productRefGroup = 4D45BF161CC7A10B003F0151 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
4D45BF141CC7A10B003F0151 /* WMPageController-Swift */,
4D45BF281CC7A10B003F0151 /* WMPageController-SwiftTests */,
4D45BF331CC7A10B003F0151 /* WMPageController-SwiftUITests */,
4D45BF621CC7BC12003F0151 /* WMPageControllerSwiftFramework */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
4D45BF131CC7A10B003F0151 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4D45BF231CC7A10B003F0151 /* LaunchScreen.storyboard in Resources */,
4D45BF201CC7A10B003F0151 /* Assets.xcassets in Resources */,
4D45BF1E1CC7A10B003F0151 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF271CC7A10B003F0151 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF321CC7A10B003F0151 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF611CC7BC12003F0151 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
4D45BF111CC7A10B003F0151 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4D45BF1B1CC7A10B003F0151 /* ViewController.swift in Sources */,
4DCCF84A1CE855F200C31A07 /* MenuView.swift in Sources */,
4DCCF8481CE855F200C31A07 /* FloodView.swift in Sources */,
4DCCF84B1CE855F200C31A07 /* PageController.swift in Sources */,
4D45BF521CC7A1EB003F0151 /* TableViewController.swift in Sources */,
4DCCF84C1CE855F200C31A07 /* ProgressView.swift in Sources */,
4D45BF191CC7A10B003F0151 /* AppDelegate.swift in Sources */,
4DCCF8491CE855F200C31A07 /* MenuItem.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF251CC7A10B003F0151 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4D45BF2E1CC7A10B003F0151 /* WMPageController_SwiftTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF301CC7A10B003F0151 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4D45BF391CC7A10B003F0151 /* WMPageController_SwiftUITests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4D45BF5E1CC7BC12003F0151 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F73DD37B1F403F3500FAC00A /* FloodView.swift in Sources */,
F73DD37C1F403F3500FAC00A /* MenuItem.swift in Sources */,
F73DD37D1F403F3500FAC00A /* MenuView.swift in Sources */,
F73DD37E1F403F3500FAC00A /* PageController.swift in Sources */,
F73DD37F1F403F3500FAC00A /* ProgressView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
4D45BF2B1CC7A10B003F0151 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4D45BF141CC7A10B003F0151 /* WMPageController-Swift */;
targetProxy = 4D45BF2A1CC7A10B003F0151 /* PBXContainerItemProxy */;
};
4D45BF361CC7A10B003F0151 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4D45BF141CC7A10B003F0151 /* WMPageController-Swift */;
targetProxy = 4D45BF351CC7A10B003F0151 /* PBXContainerItemProxy */;
};
4D45BF691CC7BC12003F0151 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4D45BF621CC7BC12003F0151 /* WMPageControllerSwiftFramework */;
targetProxy = 4D45BF681CC7BC12003F0151 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
4D45BF1C1CC7A10B003F0151 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
4D45BF1D1CC7A10B003F0151 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
4D45BF211CC7A10B003F0151 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
4D45BF221CC7A10B003F0151 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
4D45BF3B1CC7A10B003F0151 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
4D45BF3C1CC7A10B003F0151 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
4D45BF3E1CC7A10B003F0151 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = "WMPageController-Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.wecan.WMPageController-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
4D45BF3F1CC7A10B003F0151 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = "WMPageController-Swift/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.wecan.WMPageController-Swift";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Release;
};
4D45BF411CC7A10B003F0151 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
INFOPLIST_FILE = "WMPageController-SwiftTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.wecan.WMPageController-SwiftTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WMPageController-Swift.app/WMPageController-Swift";
};
name = Debug;
};
4D45BF421CC7A10B003F0151 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
INFOPLIST_FILE = "WMPageController-SwiftTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.wecan.WMPageController-SwiftTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WMPageController-Swift.app/WMPageController-Swift";
};
name = Release;
};
4D45BF441CC7A10B003F0151 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = "WMPageController-SwiftUITests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.wecan.WMPageController-SwiftUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_TARGET_NAME = "WMPageController-Swift";
};
name = Debug;
};
4D45BF451CC7A10B003F0151 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
INFOPLIST_FILE = "WMPageController-SwiftUITests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.wecan.WMPageController-SwiftUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_TARGET_NAME = "WMPageController-Swift";
};
name = Release;
};
4D45BF6C1CC7BC12003F0151 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = WMPageControllerSwiftFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.WMPageControllerSwiftFramework;
PRODUCT_MODULE_NAME = WMPageControllerSwiftFramework;
PRODUCT_NAME = WMPageControllerSwiftFramework;
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
4D45BF6D1CC7BC12003F0151 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = WMPageControllerSwiftFramework/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.wecan.WMPageControllerSwiftFramework;
PRODUCT_MODULE_NAME = WMPageControllerSwiftFramework;
PRODUCT_NAME = WMPageControllerSwiftFramework;
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4D45BF101CC7A10B003F0151 /* Build configuration list for PBXProject "WMPageController-Swift" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4D45BF3B1CC7A10B003F0151 /* Debug */,
4D45BF3C1CC7A10B003F0151 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4D45BF3D1CC7A10B003F0151 /* Build configuration list for PBXNativeTarget "WMPageController-Swift" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4D45BF3E1CC7A10B003F0151 /* Debug */,
4D45BF3F1CC7A10B003F0151 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4D45BF401CC7A10B003F0151 /* Build configuration list for PBXNativeTarget "WMPageController-SwiftTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4D45BF411CC7A10B003F0151 /* Debug */,
4D45BF421CC7A10B003F0151 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4D45BF431CC7A10B003F0151 /* Build configuration list for PBXNativeTarget "WMPageController-SwiftUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4D45BF441CC7A10B003F0151 /* Debug */,
4D45BF451CC7A10B003F0151 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4D45BF6E1CC7BC12003F0151 /* Build configuration list for PBXNativeTarget "WMPageControllerSwiftFramework" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4D45BF6C1CC7BC12003F0151 /* Debug */,
4D45BF6D1CC7BC12003F0151 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 4D45BF0D1CC7A10B003F0151 /* Project object */;
}
================================================
FILE: WMPageController-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:WMPageController-Swift.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: WMPageController-Swift.xcodeproj/xcshareddata/xcschemes/WMPageController-Swift.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0830"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF141CC7A10B003F0151"
BuildableName = "WMPageController-Swift.app"
BlueprintName = "WMPageController-Swift"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF281CC7A10B003F0151"
BuildableName = "WMPageController-SwiftTests.xctest"
BlueprintName = "WMPageController-SwiftTests"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF331CC7A10B003F0151"
BuildableName = "WMPageController-SwiftUITests.xctest"
BlueprintName = "WMPageController-SwiftUITests"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF141CC7A10B003F0151"
BuildableName = "WMPageController-Swift.app"
BlueprintName = "WMPageController-Swift"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF141CC7A10B003F0151"
BuildableName = "WMPageController-Swift.app"
BlueprintName = "WMPageController-Swift"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF141CC7A10B003F0151"
BuildableName = "WMPageController-Swift.app"
BlueprintName = "WMPageController-Swift"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: WMPageController-Swift.xcodeproj/xcshareddata/xcschemes/WMPageControllerSwiftFramework.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0830"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF621CC7BC12003F0151"
BuildableName = "WMPageControllerSwiftFramework.framework"
BlueprintName = "WMPageControllerSwiftFramework"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF621CC7BC12003F0151"
BuildableName = "WMPageControllerSwiftFramework.framework"
BlueprintName = "WMPageControllerSwiftFramework"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4D45BF621CC7BC12003F0151"
BuildableName = "WMPageControllerSwiftFramework.framework"
BlueprintName = "WMPageControllerSwiftFramework"
ReferencedContainer = "container:WMPageController-Swift.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: WMPageController-SwiftTests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: WMPageController-SwiftTests/WMPageController_SwiftTests.swift
================================================
//
// WMPageController_SwiftTests.swift
// WMPageController-SwiftTests
//
// Created by Mark on 16/4/20.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import XCTest
@testable import WMPageController_Swift
class WMPageController_SwiftTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
================================================
FILE: WMPageController-SwiftUITests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: WMPageController-SwiftUITests/WMPageController_SwiftUITests.swift
================================================
//
// WMPageController_SwiftUITests.swift
// WMPageController-SwiftUITests
//
// Created by Mark on 16/4/20.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
import XCTest
class WMPageController_SwiftUITests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
XCUIApplication().launch()
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// Use recording to get started writing UI tests.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
}
================================================
FILE: WMPageControllerSwiftFramework/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.5.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: WMPageControllerSwiftFramework/WMPageControllerSwiftFramework.h
================================================
//
// WMPageControllerSwiftFramework.h
// WMPageControllerSwiftFramework
//
// Created by Mark on 16/4/20.
// Copyright © 2016年 Wecan Studio. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for WMPageControllerSwiftFramework.
FOUNDATION_EXPORT double WMPageControllerSwiftFrameworkVersionNumber;
//! Project version string for WMPageControllerSwiftFramework.
FOUNDATION_EXPORT const unsigned char WMPageControllerSwiftFrameworkVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <WMPageControllerSwiftFramework/PublicHeader.h>
gitextract_5pm0eoic/
├── .gitignore
├── .travis.yml
├── LICENSE
├── PageController/
│ ├── FloodView.swift
│ ├── MenuItem.swift
│ ├── MenuView.swift
│ ├── PageController.swift
│ └── ProgressView.swift
├── README.md
├── StoryboardExample/
│ ├── StoryboardExample/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ ├── ParentController/
│ │ │ └── CustomPageController.swift
│ │ ├── TableViewController.swift
│ │ └── ViewController.swift
│ ├── StoryboardExample.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── StoryboardExample.xcscheme
│ ├── StoryboardExampleTests/
│ │ ├── Info.plist
│ │ └── StoryboardExampleTests.swift
│ └── StoryboardExampleUITests/
│ ├── Info.plist
│ └── StoryboardExampleUITests.swift
├── WMPageController-Swift/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ └── AppIcon.appiconset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── TableViewController.swift
│ └── ViewController.swift
├── WMPageController-Swift.podspec
├── WMPageController-Swift.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ ├── WMPageController-Swift.xcscheme
│ └── WMPageControllerSwiftFramework.xcscheme
├── WMPageController-SwiftTests/
│ ├── Info.plist
│ └── WMPageController_SwiftTests.swift
├── WMPageController-SwiftUITests/
│ ├── Info.plist
│ └── WMPageController_SwiftUITests.swift
└── WMPageControllerSwiftFramework/
├── Info.plist
└── WMPageControllerSwiftFramework.h
Condensed preview — 42 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (174K chars).
[
{
"path": ".gitignore",
"chars": 635,
"preview": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!defau"
},
{
"path": ".travis.yml",
"chars": 1246,
"preview": "language: objective-c\nosx_image: xcode7.3\nxcode_project: WMPageController-Swift.xcodeproj\nxcode_scheme: WMPageController"
},
{
"path": "LICENSE",
"chars": 1077,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Wang Ming\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "PageController/FloodView.swift",
"chars": 2241,
"preview": "//\n// FooldView.swift\n// PageController\n//\n// Created by Mark on 15/10/20.\n// Copyright © 2015年 Wecan Studio. All ri"
},
{
"path": "PageController/MenuItem.swift",
"chars": 2944,
"preview": "//\n// MenuItem.swift\n// PageController\n//\n// Created by Mark on 15/10/20.\n// Copyright © 2015年 Wecan Studio. All rig"
},
{
"path": "PageController/MenuView.swift",
"chars": 12419,
"preview": "//\n// MenuView.swift\n// PageController\n//\n// Created by Mark on 15/10/20.\n// Copyright © 2015年 Wecan Studio. All rig"
},
{
"path": "PageController/PageController.swift",
"chars": 27449,
"preview": "//\n// PageController.swift\n// PageController\n//\n// Created by Mark on 15/10/20.\n// Copyright © 2015年 Wecan Studio. A"
},
{
"path": "PageController/ProgressView.swift",
"chars": 2671,
"preview": "//\n// ProgressView.swift\n// PageController\n//\n// Created by Mark on 15/10/20.\n// Copyright © 2015年 Wecan Studio. All"
},
{
"path": "README.md",
"chars": 943,
"preview": "# WMPageController-Swift\n[](http"
},
{
"path": "StoryboardExample/StoryboardExample/AppDelegate.swift",
"chars": 2198,
"preview": "//\n// AppDelegate.swift\n// StoryboardExample\n//\n// Created by Mark on 16/1/4.\n// Copyright © 2016年 Wecan Studio. All"
},
{
"path": "StoryboardExample/StoryboardExample/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 585,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"29x29\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "StoryboardExample/StoryboardExample/Base.lproj/LaunchScreen.storyboard",
"chars": 1664,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "StoryboardExample/StoryboardExample/Base.lproj/Main.storyboard",
"chars": 7044,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "StoryboardExample/StoryboardExample/Info.plist",
"chars": 1205,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "StoryboardExample/StoryboardExample/ParentController/CustomPageController.swift",
"chars": 2841,
"preview": "//\n// CustomPageController.swift\n// StoryboardExample\n//\n// Created by Mark on 16/1/4.\n// Copyright © 2016年 Wecan St"
},
{
"path": "StoryboardExample/StoryboardExample/TableViewController.swift",
"chars": 1233,
"preview": "//\n// TableViewController.swift\n// StoryboardExample\n//\n// Created by Mark on 16/1/4.\n// Copyright © 2016年 Wecan Stu"
},
{
"path": "StoryboardExample/StoryboardExample/ViewController.swift",
"chars": 507,
"preview": "//\n// ViewController.swift\n// StoryboardExample\n//\n// Created by Mark on 16/1/4.\n// Copyright © 2016年 Wecan Studio. "
},
{
"path": "StoryboardExample/StoryboardExample.xcodeproj/project.pbxproj",
"chars": 23835,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "StoryboardExample/StoryboardExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 162,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:StoryboardExamp"
},
{
"path": "StoryboardExample/StoryboardExample.xcodeproj/xcshareddata/xcschemes/StoryboardExample.xcscheme",
"chars": 4347,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0720\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "StoryboardExample/StoryboardExampleTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "StoryboardExample/StoryboardExampleTests/StoryboardExampleTests.swift",
"chars": 1007,
"preview": "//\n// StoryboardExampleTests.swift\n// StoryboardExampleTests\n//\n// Created by Mark on 16/1/4.\n// Copyright © 2016年 W"
},
{
"path": "StoryboardExample/StoryboardExampleUITests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "StoryboardExample/StoryboardExampleUITests/StoryboardExampleUITests.swift",
"chars": 1265,
"preview": "//\n// StoryboardExampleUITests.swift\n// StoryboardExampleUITests\n//\n// Created by Mark on 16/1/4.\n// Copyright © 201"
},
{
"path": "WMPageController-Swift/AppDelegate.swift",
"chars": 4952,
"preview": "//\n// AppDelegate.swift\n// Example\n//\n// Created by Mark on 15/12/1.\n// Copyright © 2015年 Wecan Studio. All rights r"
},
{
"path": "WMPageController-Swift/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 585,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"29x29\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "WMPageController-Swift/Base.lproj/LaunchScreen.storyboard",
"chars": 1664,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "WMPageController-Swift/Base.lproj/Main.storyboard",
"chars": 1581,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "WMPageController-Swift/Info.plist",
"chars": 1205,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WMPageController-Swift/TableViewController.swift",
"chars": 3382,
"preview": "//\n// TableViewController.swift\n// PageController\n//\n// Created by Mark on 15/10/31.\n// Copyright © 2015年 Wecan Stud"
},
{
"path": "WMPageController-Swift/ViewController.swift",
"chars": 831,
"preview": "//\n// ViewController.swift\n// PageController\n//\n// Created by Mark on 15/10/20.\n// Copyright © 2015年 Wecan Studio. A"
},
{
"path": "WMPageController-Swift.podspec",
"chars": 684,
"preview": "Pod::Spec.new do |s|\n s.name = \"WMPageController-Swift\"\n s.version = \"1.4.0\"\n s.summary = \"An ea"
},
{
"path": "WMPageController-Swift.xcodeproj/project.pbxproj",
"chars": 31760,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "WMPageController-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 167,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:WMPageControlle"
},
{
"path": "WMPageController-Swift.xcodeproj/xcshareddata/xcschemes/WMPageController-Swift.xcscheme",
"chars": 4437,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0830\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "WMPageController-Swift.xcodeproj/xcshareddata/xcschemes/WMPageControllerSwiftFramework.xcscheme",
"chars": 3033,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0830\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "WMPageController-SwiftTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WMPageController-SwiftTests/WMPageController_SwiftTests.swift",
"chars": 1023,
"preview": "//\n// WMPageController_SwiftTests.swift\n// WMPageController-SwiftTests\n//\n// Created by Mark on 16/4/20.\n// Copyrigh"
},
{
"path": "WMPageController-SwiftUITests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WMPageController-SwiftUITests/WMPageController_SwiftUITests.swift",
"chars": 1281,
"preview": "//\n// WMPageController_SwiftUITests.swift\n// WMPageController-SwiftUITests\n//\n// Created by Mark on 16/4/20.\n// Copy"
},
{
"path": "WMPageControllerSwiftFramework/Info.plist",
"chars": 808,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WMPageControllerSwiftFramework/WMPageControllerSwiftFramework.h",
"chars": 637,
"preview": "//\n// WMPageControllerSwiftFramework.h\n// WMPageControllerSwiftFramework\n//\n// Created by Mark on 16/4/20.\n// Copyri"
}
]
About this extraction
This page contains the full source code of the wangmchn/WMPageController-Swift GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 42 files (156.7 KB), approximately 45.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.