首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向uistackview添加uistackview控制器

向uistackview添加uistackview控制器
EN

Stack Overflow用户
提问于 2015-12-30 05:02:13
回答 1查看 937关注 0票数 0

我试图在视图的顶部添加一个滑动照片库功能。

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

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

与我的应用程序的教程唯一相关的偏差是,它以编程的方式创建东西。

在验证了库功能的概念之后,我想将它与前面提到的堆栈视图集成起来。我的计划是首先将pageviewcontroller的内容添加到整个堆栈视图中,并将原始图像视图放在它下面,然后简单地删除原始图像视图,留给我最终的产品。

我能够将pageviewcontroller.view添加到堆栈视图中,但是图库没有显示。看看UI检查器,我可以看到画廊是有点加载,但它是混乱的。

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

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

还要注意:我的实现都是编程的,没有故事板,所以没有xibs。所以也许我漏掉了什么东西。

下面是一些代码,如果有帮助的话:

请注意,您看到的约束函数来自“地图学”荚。

这将“图库”添加到堆栈视图中,这是我的视图中的委托函数。

代码语言:javascript
复制
func addZoomStuff(sender: UIStackView) {

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

}

这就是创建库项的滚动视图、图像视图等的内容:

代码语言:javascript
复制
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(发件人: UIStackView) {

代码语言:javascript
复制
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,并以某种方式获得相同的滚动/快照效果,一次在图像视图上查看吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-30 06:55:36

TLDR;

  • 创建UIPageViewController的子类,使其成为自己的委托。
  • 使用普通的UIViewController初始化子类,只设置背景颜色。
  • 在pageviewcontroller子类中,为下一个视图控制器和前一个视图控制器实现两个委托回调:创建一个普通的viewcontroller,带有一些随机背景颜色。如果这样做有效,请用实际的contentviewcontroller替换普通的视图控制器。

长篇版本:

您看过这个链接吗?也许这个链接会有所帮助:https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/PageViewControllers.html --它可能会有所帮助,因为它解释了UIPageViewController的细节。基本上,您需要创建一个viewController (不是视图!),它显示库的一个页面。因此,这个VC有一个堆栈视图,并管理它的内容。使用第一个contentviewController初始化页面视图控制器。如果创建uipageviewcontroller的子类,则可以将该子类的self设置为它的委托。实现返回下一个或上一个viewController的委托回调,就这样。对于最后一部分,在contentviewcontroller上有一个属性是很方便的,其中pageviewcontroller的子类可以确定要在下一个或以前的视图控制器上设置哪些数据。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34523183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档