pageViewController 上的背景图像反向重叠
Posted
技术标签:
【中文标题】pageViewController 上的背景图像反向重叠【英文标题】:background Images on pageViewController overlap in reverse 【发布时间】:2015-11-16 18:55:02 【问题描述】:我有一个pageViewController
,它显示每个索引的背景图像。从左到右(向前)滑动效果很好,但是当您反向滑动时,背景图像会相互重叠。在我实现背景图像之前,每个 VC 上的 UI 都可以正常工作,所以我知道它是背景图像。此外,如果我在我的storyboard
中更改为page curl
而不是scroll
,它反向工作正常,只是不适用于scroll
。这显然是一个已知的错误 (Removing a view controller from UIPageViewController) 但是我需要 Swift 中的解决方案。
pageviewController:
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?
guard
let currentPageViewController = viewController as? SinglePageViewController,
let currentIndex = indexOfForecast(currentPageViewController.forecast!) as? Int where currentIndex != 0 else return nil //fixed bug where index was -0 only on scroll
return viewControllerAtIndex(currentIndex - 1)
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?
guard
let lastForecast = forecasts?.last,
let currentPageViewController = viewController as? SinglePageViewController, currentForecast = currentPageViewController.forecast,
let currentIndex = indexOfForecast(currentForecast) as? Int where currentIndex != forecasts?.indexOf(lastForecast) else return nil
return viewControllerAtIndex(currentIndex + 1)
func viewControllerAtIndex(index: Int) -> UIViewController?
if let forecast = forecasts?[index]
let time = forecastTimes[index]
let imageURL = conditionsIcons[index]
let backgroundImageName = backgroundImageNames.names[index]
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("SinglePageViewController") as! SinglePageViewController
vc.forecast = forecast
vc.time = time
vc.imageURL = imageURL
vc.backgroundImageName = backgroundImageName
return vc
return nil
func showVC()
if let firstVC = viewControllerAtIndex(0)
busyAlertController.dismiss()
let viewControllers = [firstVC]
self.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
singlePageViewController:
override func viewDidLoad()
super.viewDidLoad()
backgroundImage = UIImageView(image: UIImage(named: backgroundImageName!))
backgroundImage.contentMode = UIViewContentMode.ScaleAspectFill
self.view.insertSubview(backgroundImage, atIndex: 0)
【问题讨论】:
从我所看到的,看起来你正在添加多个视图控制器,但永远不要删除它们,也许这是从左到右故意的,但从右到左你不想再次添加 谢谢@Knight0fDragon 你的评论引导我搜索,我在这里找到了这个确切的问题:***.com/questions/14220289/… 但是我留下了我的问题,因为答案只在 Obj-C 中,我正在使用 Swift . 【参考方案1】:这个问题的答案就是这么简单,只要把图片上的clipsToBounds
设置成true
就行了
【讨论】:
非常感谢!我遇到了同样的问题并尝试了几个小时 :) 你救了我 ;) @pasql 很高兴它帮助了你 =)【参考方案2】:根据我的回答 over here,这是一个 Swift 版本。请注意,这是使用在线转换器从 Objective-C 转换为 Swift 的(因为我不在我的开发机器上——并且通常不在 Swift 中工作),并添加了一些摆弄来获得弱自引用的权利。请随时指出实施中的任何错误。
pageViewController.setViewControllers(
viewControllers,
direction: UIPageViewControllerNavigationDirectionForward,
animated: true,
completion: [weak pageViewController] (finished: Bool) in
if finished
dispatch_async(dispatch_get_main_queue(),
pageViewController.setViewControllers(
viewControllers,
direction: UIPageViewControllerNavigationDirectionForward,
animated: false,
completion: nil
)
)
)
[weak ...]
的技巧被称为“捕获列表”,在 this question 以及 official docs 的“定义捕获列表”部分中有很好的介绍。
(如果您没有对此进行跟踪,我们的意图是我们不希望我们的闭包对pageViewController
有强引用,从而防止 ARC 在不再需要它时释放它。所以我们将该变量标记为弱引用,如果闭包是最后剩下的对pageViewController
的引用,sayonara)。
另外一点是,我没有关注事物的可选方面,所以请注意实现者。
编辑:
查看您的代码,我的答案似乎根本不是您想要的。我的答案解决的问题是以编程方式设置视图控制器,但您说的是滑动。
我的猜测是你还没有实现所有的委托方法——我只看到viewControllerAtIndex
。不是必须做viewControllerBeforeViewController
和viewControllerAfterViewController
才能正常工作吗? (抱歉,我已经有一段时间没有处理那门课了。)粗略地看了一眼 this tutorial 让我这么想……
不管怎样,我认为已经发生了吠叫错误的树。请检查一下,也许可以详细说明您的问题,显示更多代码等。
【讨论】:
谢谢马特!问题出在 [weak pageViewController] pageViewController 定义在哪里?这里不应该是自我吧?因为我尝试使用 [weak self] 和 self.setViewControllers 但它并没有阻止问题 @PSUSabes 没有问题。但是,这里的方向变化很小。请查看我编辑的帖子。 hmmmm,我确实实现了这些委托方法并将它们发布到我的问题中。我无法理解的是,为什么我的代码可以在属性检查器中设置“curl”时完美运行,但是当您向后滚动时,“scroll”会导致 VC 混乱?再次感谢您的时间!【参考方案3】:除了@GarySabo 的回答之外,我还必须像这样将图像的约束布局到超级视图(在我的情况下是默认视图):
【讨论】:
以上是关于pageViewController 上的背景图像反向重叠的主要内容,如果未能解决你的问题,请参考以下文章
Pageviewcontroller 在 IOS 6 中不显示翻页动画
UIPageViewController 具有一个恒定的背景图像