swift - 我想重现 Twitter 和 Instagram 的通知系统
问题描述
我试图将我的视图控制器分成两个不同的部分,通过向右或向左滑动来访问,就像 Twitter 和 Instagram 的通知一样。
我不知道这个设计的名字是什么,所以我对谷歌的研究没有成功。我试着自己做。我有一个视图控制器,其中有一个视图包含 2 个部分标签,光标在下方,还有一个视图容器包含一个页面视图控制器以启用滑动。我可以在 2 个部分之间滑动,但我不知道在 2 个部分之间滑动时如何移动光标并更改标签的颜色和重量。
这是我画线和光标的视图代码:
class LineView: UIView {
let cursor = CAShapeLayer()
override func draw(_ rect: CGRect) {
let line = UIBezierPath()
line.lineWidth = 1
line.move(to: CGPoint(x: 0, y: 0))
line.addLine(to: CGPoint(x: self.frame.width,y: 0))
UIColor.lightGray.setStroke()
line.stroke()
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: self.frame.width / 2, y: 0))
cursor.path = path.cgPath
cursor.strokeColor = UIColor(red:1.00, green:0.09, blue:0.40, alpha:1.0).cgColor
cursor.lineWidth = 2
layer.addSublayer(cursor)
}
}
和我的页面视图控制器的代码:
class HomePageViewController: UIPageViewController, UIPageViewControllerDataSource {
lazy var viewControllerList : [UIViewController] = {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController1 = storyboard.instantiateViewController(withIdentifier: "PublicViewController")
let viewController2 = storyboard.instantiateViewController(withIdentifier: "PrivateViewController")
return [viewController1, viewController2]
}()
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
if let firstViewController = viewControllerList.first {
self.setViewControllers([firstViewController], direction: .forward, animated: false, completion: nil)
}
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let index = viewControllerList.firstIndex(of: viewController) else { return nil }
let previousIndex = index - 1
guard previousIndex >= 0 else { return nil }
guard viewControllerList.count > previousIndex else { return nil }
return viewControllerList[previousIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let index = viewControllerList.firstIndex(of: viewController) else { return nil }
let nextIndex = index + 1
guard viewControllerList.count != nextIndex else { return nil }
guard viewControllerList.count > nextIndex else { return nil }
return viewControllerList[nextIndex]
}
}
我不确定这是正确的方法!
解决方案
您可以将集合视图用于标题,即Public和Private。
对于控制器,我已将其放置UIScrollView
在情节提要的视图控制器内。然后在滚动视图内添加两个容器视图后,与滚动视图相等且高度相同。关于代码,您可以在下面的项目中下载。
这是您想要的完整演示项目:CustomStepperController
推荐阅读
- php - laravel上传新头像后如何删除旧头像?
- macos - 如何从局域网上的 Windows 10 家用电脑 RDP Ubuntu 16.04 和 OSX
- angular - 自定义验证器以检查密码是否在 Angular 6 和响应式表单中匹配
- python - 使用 Python 和 websocket-client 库发送安全 (SSL) Web 套接字请求,并希望更好地了解正在发生的事情
- javascript - 如何在 location.replace 后保持浏览器窗口全屏?
- python - 如何在不覆盖的情况下将数据附加到数据帧?
- node.js - 当应用程序被杀死时,我如何跟踪我的移动应用程序用户
- c# - 如何反序列化没有键的json数组?C#
- php - 检查键是否存在于另一个数组中,然后取值
- c - 如何使用标头将多个 c 文件链接在一起?