将 uipageviewcontroller 添加到 uistackview

Posted

技术标签:

【中文标题】将 uipageviewcontroller 添加到 uistackview【英文标题】:adding a uipageviewcontroller to a uistackview 【发布时间】:2015-12-30 05:02:13 【问题描述】:

我正在尝试将滑动照片库功能添加到视图的顶部。

为了给出上下文,用户点击按钮或行或其他东西。然后我加载一个带有 uistackview 的滚动视图。垂直组织,我有一个图像,然后是另一个堆栈视图,其中包含一些文本。现在,我希望该图像成为更大的“画廊”的一部分。我的研究告诉我实现 UIPageviewcontroller 并将其他图像添加到 childVC。

我用这个作为教程(第一个例子):http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

我的应用与教程的唯一相关偏差是它以编程方式创建内容。

通过我对图库功能的概念验证,我想将它与前面提到的堆栈视图集成。我的计划是首先将 pageviewcontroller 的东西添加到整个堆栈视图中,原始图像视图就在它的正下方,然后简单地删除原始图像视图,让我得到最终产品。

我能够将 pageviewcontroller.view 添加到 stackview,但画廊没有显示。看看 UI Inspector,我可以看到画廊已经加载了,但它搞砸了。

就好像 uiview 有一个高度为 0 的框架,因此其他堆栈视图项不尊重 pageviewcontroller 试图显示的图像。

我认为堆栈视图可能只能处理特定视图,而不是像 pageviewcontrollers 这样复杂的东西。

另请注意:我的实现都是程序化的,没有故事板,所以没有 xib。所以也许我在这里错过了一些东西。

这里有一些代码,如果有帮助的话:

请注意,您看到的约束函数来自“制图”窗格

这会将“画廊”添加到堆栈视图中,从我的角度来看,它是一个委托函数

func addZoomStuff(sender: UIStackView) 

let zoomer = PageBaseViewController()
addChildViewController(zoomer)
zoomer.view.translatesAutoresizingMaskIntoConstraints = false
zoomer.view.tag = 5
sender.addArrangedSubview(zoomer.view)
zoomer.didMoveToParentViewController(self)

这是为画廊项目创建滚动视图、图像视图等的原因:

override func viewDidLoad() 
super.viewDidLoad()
//MARK: - Zoom View Elements

// prep
scrollView = UIScrollView(frame: self.view.frame)
scrollView.delegate = self
self.view.addSubview(scrollView)

constrain(scrollView, view)  view, view2 in
    view.edges == view2.edges


self.view.setNeedsUpdateConstraints()

// 1
let image = UIImage(named: imageName)!
imageView = UIImageView(image: image)

// 2
scrollView.addSubview(imageView)

constrain(imageView) view in
    view.edges == view.superview!.edges


scrollView.contentSize = image.size

我尝试添加这样的约束,但没有效果

func addZoomStuff(sender: UIStackView)

let zoomer = PageBaseViewController()
addChildViewController(zoomer)
view.addSubview(zoomer.view)
constrain(zoomer.view, view)  view, view2 in
    view.width == view2.width
    view.height == view2.height * 2 / 3
    view.leading == view2.leading
    view.top == view2.top

zoomer.view.setNeedsUpdateConstraints()
zoomer.view.removeFromSuperview()
zoomer.view.translatesAutoresizingMaskIntoConstraints = false
zoomer.view.tag = 5
print("sender.subviews: \(sender.subviews)")
sender.addArrangedSubview(zoomer.view)
zoomer.didMoveToParentViewController(self)
print("sender.subviews: \(sender.subviews)")

如果这个方法不起作用,我可以做一个嵌套的水平堆栈视图而不是 pageviewcontroller 并以某种方式获得相同的滚动/捕捉效果,以便一次在图像视图上看到?

【问题讨论】:

【参考方案1】:

TLDR;

创建 UIPageViewController 的子类,使其成为自己的委托。 用普通的 UIViewController 初始化子类,只设置背景色。 在 pageviewcontroller 子类中,为下一个和上一个 viewcontroller 实现两个委托回调:创建一个普通的 viewcontroller,带有一些随机背景色。 如果可行,请将普通视图控制器替换为您的实际内容视图控制器。

长版:

你看到了吗:也许这个链接会有所帮助:https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/PageViewControllers.html 它可能会有所帮助,因为它解释了 UIPageViewController 的详细信息。基本上,您需要创建一个视图控制器(不是视图!),它显示画廊的一页。所以这个VC有一个stackview,并管理它的内容。 pageviewcontroller 使用您的第一个 contentviewController 进行初始化。如果创建 uipageviewcontroller 的子类,则可以将该子类的 self 设置为它的委托。实现返回下一个或上一个 viewController 的委托回调,仅此而已。对于最后一部分,在 contentviewcontroller 上有一个属性会很方便,pageviewcontroller 的子类可以通过该属性确定在下一个或上一个视图控制器上设置什么数据。

您的标题试图暗示一些混淆:不可能将视图控制器添加到视图中。您只能将其他视图添加到(堆栈)视图。视图控制器拥有并管理视图层次结构。 pageviewcontroller 没有内容,但管理 viewcontroller 的插入和删除。由于 pageviewcontroller 是一个 containerviewcontroller,它也将获取 contentViewcontroller 的视图并将它们放置在视图层次结构中。但是,当您将 UIPageViewControlller 子类化并在其自身上实现它的委托时,这不是您的代码必须做的事情(并且不要忘记将 self 指定为委托)。

【讨论】:

实际上我给了我用来做页面视图控制器的教程的错误链接。实际上就是这个,所以我想我大部分时间都在听从你的指示。就像,我已经创建了画廊项目控制器。我猜想将 mainpageviewcontroller 的 self.view 添加到堆栈视图中并不是它应该如何工作的。 :) swiftiostutorials.com/… 我认为不是页面控制器,而是尝试水平滚动堆栈视图实际上对我来说听起来更干净。 是的,我是个白痴。我完全忘记了 uiscrollview 有分页功能。有理由不在页面视图控制器上使用它吗?通过不使用额外的控制器,我似乎为自己节省了很多开销。 是的,这实际上是最干净的解决方案。很酷,您现在可以继续。我会留下我的答案,它可能会帮助其他人,谁知道。 听起来不错。感谢您花时间写下这个答案!

以上是关于将 uipageviewcontroller 添加到 uistackview的主要内容,如果未能解决你的问题,请参考以下文章

怎么将 Python 重新添加到环境变量?

如何将 Groups 添加到 ListView,然后将 Items 添加到 Groups

使用 PHPhotoLibrary 将照片添加到自定义文件夹还会将照片添加到相机胶卷

将Bot添加到电路空间-“无法添加”

将设备添加到团队配置文件

将drawable添加到CirclePageIndicator