UIPageViewController 第二页和第三页闪烁为白色
UIPageViewController second and third page flickers to white
我有一个pageviewcontroller
,但是当我滑动到第二页时,它会显示右控制器一瞬间,然后屏幕变白,如果我再滑动它就会显示出来应该。它也有 4 页,而不是我预期的 3 页。
这是一个演示问题的视频:https://streamable.com/i1inq
索引如下:
profileController.index = 0
discoverController.index = 1
matchController.index = 2
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
if index == 0
{
index = discoverController.index
return discoverController
}
else if index == 1
{
index = matchController.index
return matchController
}
return nil
}
编辑:我还应该提到初始控制器是 profileController,因此当应用程序为 运行 时索引从 0 开始。
已更新
您可以简单地修改您自定义的代码 viewcontroller 为 index
属性:
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
let index = (viewController as? MyCustomVCWithIndexForPageViewController).index
if index == 0
{
index = discoverController.index
return discoverController
}
else if index == 1
{
index = matchController.index
return matchController
}
return nil
}
原创
您不应缓存与页面相关的参数viewcontroller。
UIPageViewController
有时 preload
您的页面会有更好的性能。
例如:
您有 3 个页面要显示。
您现在显示的是首页首字母。
然后滚动到第二个视图。 viewControllerAfter
调用了第一个 viewcontroller 的 viewController
来请求第二个 viewcontroller。
并且 viewControllerAfter
再次调用 viewController
第二个 viewcontroller 请求第三个 viewcontroller (预加载)。
这种情况下如果缓存索引,会导致不可预知的结果。
您没有提供足够的代码来检测导致问题的原因。但这是我通常使用 PageController
的方式
class ViewController: UIViewController {
var pages = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
// add pages to the array
// ...
}
}
extension ViewController: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController? {
// find index of viewcontroller in array
if let index = pages.index(of: viewController) {
switch index {
// if index is last item you should return first item
case pages.count - 1:
return pages[0]
default:
// by default return next item in array
return pages[index + 1]
}
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController? {
// find index of viewcontroller in array
if let index = pages.index(of: viewController) {
switch index {
// if index is 0 you should return last item in array
case 0:
return pages[pages.count - 1]
default:
// by default return previous item in array
return pages[index - 1]
}
}
return nil
}
}
我有一个pageviewcontroller
,但是当我滑动到第二页时,它会显示右控制器一瞬间,然后屏幕变白,如果我再滑动它就会显示出来应该。它也有 4 页,而不是我预期的 3 页。
这是一个演示问题的视频:https://streamable.com/i1inq
索引如下:
profileController.index = 0
discoverController.index = 1
matchController.index = 2
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
if index == 0
{
index = discoverController.index
return discoverController
}
else if index == 1
{
index = matchController.index
return matchController
}
return nil
}
编辑:我还应该提到初始控制器是 profileController,因此当应用程序为 运行 时索引从 0 开始。
已更新
您可以简单地修改您自定义的代码 viewcontroller 为 index
属性:
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
let index = (viewController as? MyCustomVCWithIndexForPageViewController).index
if index == 0
{
index = discoverController.index
return discoverController
}
else if index == 1
{
index = matchController.index
return matchController
}
return nil
}
原创
您不应缓存与页面相关的参数viewcontroller。
UIPageViewController
有时 preload
您的页面会有更好的性能。
例如:
您有 3 个页面要显示。
您现在显示的是首页首字母。
然后滚动到第二个视图。 viewControllerAfter
调用了第一个 viewcontroller 的 viewController
来请求第二个 viewcontroller。
并且 viewControllerAfter
再次调用 viewController
第二个 viewcontroller 请求第三个 viewcontroller (预加载)。
这种情况下如果缓存索引,会导致不可预知的结果。
您没有提供足够的代码来检测导致问题的原因。但这是我通常使用 PageController
的方式class ViewController: UIViewController {
var pages = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
// add pages to the array
// ...
}
}
extension ViewController: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController? {
// find index of viewcontroller in array
if let index = pages.index(of: viewController) {
switch index {
// if index is last item you should return first item
case pages.count - 1:
return pages[0]
default:
// by default return next item in array
return pages[index + 1]
}
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController? {
// find index of viewcontroller in array
if let index = pages.index(of: viewController) {
switch index {
// if index is 0 you should return last item in array
case 0:
return pages[pages.count - 1]
default:
// by default return previous item in array
return pages[index - 1]
}
}
return nil
}
}