Xcode XIB:如何实现 ScrollView 或 PageControl 滑动 sub-views?
Xcode XIB: how to implement a ScrollView or PageControl to swipe sub-views?
我正在构建一个典型的 Xcode 6 iOS 应用程序。
我的目标是:
屏幕上有一个 sub-area 可以滑动以更改内容。
例如,主屏幕有一个徽标图像、一个我想要滑动的中间区域和一个底部按钮。
当用户滑动(或点击)中间区域时,该区域显示下一个(或上一个)信息,这是典型的 UIImage 和 UILabel 标题。
屏幕的其余部分保持不变,即导航没有变化。
密码是here. It use the recommendations from the Whosebug post here.
我的问题:我怎样才能更好地实现下面的代码,同时仍然使用 XIB?
我当前的实现确实有效,并且使用了这种方法...
一个典型的 Swift Demo.swift
文件是一个 UIViewController,它有:
- 页面索引、最小值和最大值
- PageControl、UIImageView 和 UILabel 的出口
- 页面控件的动作变化,图像滑动或点击
典型的 Demo.xib
文件具有:
- 整个屏幕的典型 UIViewController
- 用于可变图像和标题文本的 UIImageView 和 UILabel
- 指示用户正在查看哪个教程页面的 PageControl
我正在寻找更好的方法来完成这项工作;我读过许多 Xcode 教程,到目前为止 none 似乎对 Xcode 6、XIB 和 Swift.
是权威的
以下是我研究过的一些看起来很有前途的实现...
有没有办法在XIB中实现子视图区域?
- 例如,Xocde 可以用一个矩形区域显示 XIB,该区域用于可变内容吗?
是否有一种惯用的方式来编写可变内容的代码?
- 例如,通过使用 ScrollView,也许它包含一个 UIPageViewController?
有没有办法让 PageControl XIB object 足够大以覆盖整个 UIImageView 和 UILabel,这样我就可以跳过让 UIImageView 响应手势。
- 在我的 Xcode 中,PageControl 似乎有一个不可编辑的高度,它总是 37。
赏金将征求专家意见。
如果您向 PageControl 添加高度限制,您可以将其高度设置为任何您想要的高度。
我认为您当前的实施没有问题。将其更改为使用 PageViewController 将需要更多工作。
如果我是你,我会在 pageUpdate 函数中添加一个动画,这样图像就会淡入或滑入...
只有当您希望能够滚动到下一页(就像您的手指在屏幕上移动的同时移动内容)时,才有意义使用 PageViewController。您可以使用启用分页的 PageViewController 或 CollectionView。
要使 UIPageViewController 可滑动,您应该实施 UIPageViewControllerDataSource
协议并为 pageViewController(pageViewController:viewControllerBeforeViewController) -> UIViewController?
和 ...viewControllerAfterViewController)
方法提供视图控制器。
为每个显示图像和标签的页面提供一个自定义视图控制器,并将它们作为属性,以便您可以从 PageViewController 提供它们。
我的技巧是创建一个在这些方法中实例化新视图控制器的方法:
// MARK:- UIPageViewControllerDataSource
extension MyPageViewController: UIPageViewControllerDataSource {
func viewControllerWithIndex(var index: Int) -> UIViewController! {
let viewController = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as! MyViewController // This VC has to be in the storyboard, otherwise just use MyVC()
// Adjust the index to be cyclical, not required
if let count = data?.endIndex {
if count == 1 && index != 0 { return nil }
if index < 0 { index += count }
index %= count
}
viewController.view.tag = index
viewController.record = data?[index]
return viewController
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let index = viewController.view?.tag ?? 0
return viewControllerWithIndex(index + 1)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let index = viewController.view?.tag ?? 0
return viewControllerWithIndex(index - 1)
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return countAndSetupPageControl()
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return viewController?.view.tag ?? 0
}
}
现在,对于 "sub-area",您需要实施 ChildViewController
。如果您使用的是故事板,则只需拖动 Container View
并将 PageViewController
放入嵌入式视图控制器中,否则您需要将 PageViewController.view
添加为子视图并设置 frame
到中间。
您可以在 apple documentation 中找到更多信息,但基本上您必须调用这些方法:
addChildViewController(pageViewController)
view.addSubView(pageViewController.view)
pageViewController.view.frame = ... // This is your "sub-area"
pageViewController.didMoveToParentViewController(self)
我正在构建一个典型的 Xcode 6 iOS 应用程序。
我的目标是:
屏幕上有一个 sub-area 可以滑动以更改内容。
例如,主屏幕有一个徽标图像、一个我想要滑动的中间区域和一个底部按钮。
当用户滑动(或点击)中间区域时,该区域显示下一个(或上一个)信息,这是典型的 UIImage 和 UILabel 标题。
屏幕的其余部分保持不变,即导航没有变化。
密码是here. It use the recommendations from the Whosebug post here.
我的问题:我怎样才能更好地实现下面的代码,同时仍然使用 XIB?
我当前的实现确实有效,并且使用了这种方法...
一个典型的 Swift Demo.swift
文件是一个 UIViewController,它有:
- 页面索引、最小值和最大值
- PageControl、UIImageView 和 UILabel 的出口
- 页面控件的动作变化,图像滑动或点击
典型的 Demo.xib
文件具有:
- 整个屏幕的典型 UIViewController
- 用于可变图像和标题文本的 UIImageView 和 UILabel
- 指示用户正在查看哪个教程页面的 PageControl
我正在寻找更好的方法来完成这项工作;我读过许多 Xcode 教程,到目前为止 none 似乎对 Xcode 6、XIB 和 Swift.
是权威的以下是我研究过的一些看起来很有前途的实现...
有没有办法在XIB中实现子视图区域?
- 例如,Xocde 可以用一个矩形区域显示 XIB,该区域用于可变内容吗?
是否有一种惯用的方式来编写可变内容的代码?
- 例如,通过使用 ScrollView,也许它包含一个 UIPageViewController?
有没有办法让 PageControl XIB object 足够大以覆盖整个 UIImageView 和 UILabel,这样我就可以跳过让 UIImageView 响应手势。
- 在我的 Xcode 中,PageControl 似乎有一个不可编辑的高度,它总是 37。
赏金将征求专家意见。
如果您向 PageControl 添加高度限制,您可以将其高度设置为任何您想要的高度。
我认为您当前的实施没有问题。将其更改为使用 PageViewController 将需要更多工作。
如果我是你,我会在 pageUpdate 函数中添加一个动画,这样图像就会淡入或滑入...
只有当您希望能够滚动到下一页(就像您的手指在屏幕上移动的同时移动内容)时,才有意义使用 PageViewController。您可以使用启用分页的 PageViewController 或 CollectionView。
要使 UIPageViewController 可滑动,您应该实施 UIPageViewControllerDataSource
协议并为 pageViewController(pageViewController:viewControllerBeforeViewController) -> UIViewController?
和 ...viewControllerAfterViewController)
方法提供视图控制器。
为每个显示图像和标签的页面提供一个自定义视图控制器,并将它们作为属性,以便您可以从 PageViewController 提供它们。
我的技巧是创建一个在这些方法中实例化新视图控制器的方法:
// MARK:- UIPageViewControllerDataSource
extension MyPageViewController: UIPageViewControllerDataSource {
func viewControllerWithIndex(var index: Int) -> UIViewController! {
let viewController = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as! MyViewController // This VC has to be in the storyboard, otherwise just use MyVC()
// Adjust the index to be cyclical, not required
if let count = data?.endIndex {
if count == 1 && index != 0 { return nil }
if index < 0 { index += count }
index %= count
}
viewController.view.tag = index
viewController.record = data?[index]
return viewController
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let index = viewController.view?.tag ?? 0
return viewControllerWithIndex(index + 1)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let index = viewController.view?.tag ?? 0
return viewControllerWithIndex(index - 1)
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return countAndSetupPageControl()
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return viewController?.view.tag ?? 0
}
}
现在,对于 "sub-area",您需要实施 ChildViewController
。如果您使用的是故事板,则只需拖动 Container View
并将 PageViewController
放入嵌入式视图控制器中,否则您需要将 PageViewController.view
添加为子视图并设置 frame
到中间。
您可以在 apple documentation 中找到更多信息,但基本上您必须调用这些方法:
addChildViewController(pageViewController)
view.addSubView(pageViewController.view)
pageViewController.view.frame = ... // This is your "sub-area"
pageViewController.didMoveToParentViewController(self)