我尝试在我的应用程序用户界面中添加行为,用户可以向左滑动,这将导致一组UILabels在屏幕左侧同步滚动,但是然后立即再次向右滚动,但从右侧滚动,但包含新信息。
这种效果意味着给人的印象是你从一个"设置"信息到下一个...比如说,在开始比赛之前选择一辆车...但实际上它是相同的视图被重复使用...滚动屏幕以使他们的label.text信息更新..然后又滚回去了。
我刷了所有的照顾。我遇到的问题是我的(工作)解决方案:
UIView.animate(withDuration: 0.2, animations: {
// move label off to the left
self.titleLabel.center.x -= self.view.bounds.width
}, completion: {
$0 ; print("I'm halfway done!")
// teleport view to a location off to the right
self.titleLabel.center.x += 2*(self.view.bounds.width)
// reset label's data
self.titleLabel.text = NEW_INFO
// slide label back on screen from the right
UIView.animate(withDuration: 0.2, animations: {
self.titleLabel.center.x -= self.view.bounds.width
}, completion: nil)
})
感觉像穿着别人的内衣一样无用。
$ 0的唯一原因是让XCode停止说:
"无法转换类型'() - >的值()'预期参数类型'((Bool) - > Void)?'"
而且我确信我在完成程序段中完成动画的第二部分会导致头痛。
有更聪明的方法吗?
PS - 我宁愿不使用任何预先制作的类,例如" ScrollView"或类似的......这些视图都是单独的交互式,并响应其他回调等。
谢谢!
答案 0 :(得分:1)
更好的方法是使用UIPageViewController
。
这需要一些学习和设置,但比尝试自己动手更容易。
采用UIPageViewController
的方法是这样的......
创建数据模型......使用您的类比......
struct Car {
let image: UIImage
let name: String
}
然后创建一个将显示它的UIViewController子类。
class CarViewController: UIViewController {
var car: Car? {
didSet {
displayCar()
}
}
func displayCar() {
label.text = car?.name
imageView.image = car?.image
}
}
然后你创建一个UIPageViewController
。在这里你有一系列汽车。然后在函数func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
中,您可以创建CarViewController
并从数组中传入正确的Car
。
然后,这将完成所有滚动和显示,并且所有内容仍然是交互式的。
有关其工作原理的更多信息,您可以查看this one from Ray Wenderlich等教程。
您也可以使用它来显示页面的一部分(而不是滚动整个屏幕。