我正在构建一个典型的Xcode 6 iOS应用。
我的目标是:
具有可以滑动以更改内容的子区域的屏幕。
例如,主屏幕有一个徽标图像,一个我想要可以刷卡的中间区域和一个底部按钮。
当用户滑动(或点击)中间区域时,该区域显示下一个(或上一个)信息,这是典型的UIImage和UILabel标题。
屏幕的其余部分保持不变,即没有导航更改。
代码为here。它使用StackOverflow帖子here中的建议。
我的问题:如何在使用XIB的同时更好地实现下面的代码?
我当前的实现确实有效,并使用这种方法......
典型的Swift Demo.swift
文件,它是一个UIViewController,具有:
典型的Demo.xib
文件:
我正在寻求更好的方法来实现这一目标;我已经阅读了许多Xcode教程,到目前为止,Xcode 6,XIB和Swift似乎都不具备确定性。
以下是我研究过的一些看似很有希望的实现......
有没有办法在XIB中实现子视图区域?
是否有一种惯用的方式来编写可更改内容的代码?
有没有办法让PageControl XIB对象足够大以覆盖整个UIImageView和UILabel,所以我可以跳过让UIImageView响应手势。
赏金将用于专家建议。
答案 0 :(得分:2)
要使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
}
}
现在,对于“子区域”,您需要实现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)
答案 1 :(得分:1)
如果您向PageControl添加高度约束,您可以将其高度设置为您想要的任何高度。
我没有看到您当前实施的问题。将其更改为使用PageViewController将会更加有效。
如果我是你,我会在pageUpdate函数中添加动画,以便图像淡入或滑入...
如果您希望能够滚动到下一页(就像在手指在屏幕上移动的同时移动内容一样),那么使用PageViewController是有意义的。您可以使用PageViewController或CollectionView启用分页。