我试图将UIPageViewController的UIPanGestureRecognizer分配给不同的(自定义)视图,以便用于页面切换的平移手势仅适用于屏幕的某个区域。代码基本上如下:
let testView = UIView(frame: CGRect(x: 0, y:self.view.frame.height/2, width: 320, height: self.view.frame.height/2))
self.view.addSubview(testView)
for gr in self.pageViewController!.view.subviews[0].gestureRecognizers! {
if gr.isKindOfClass(UIPanGestureRecognizer) {
testView.addGestureRecognizer(gr)
}
}
问题是" next"在进行平移时,视图控制器不会立即可见,在第一次平移时,它看起来当前的视图控制器(第一个)是PageViewController中唯一的一个,只有在结束平移并进行第二次平移之后视图控制器出现。
请注意,如果不将UIPanGesture分配给不同的视图,则PageViewController将按预期工作,并且自第一次平移以来可见下一个视图控制器。
我为什么要这样做?我需要在PageViewController中的视图控制器中添加一个子视图,该视图控制器没有" pan"当用户在其上面做手势时,PageViewController。
答案 0 :(得分:0)
UIPageViewController
class PageController:UIPageViewController {
let viewControllers:[UIViewController] = [MyController(), MyController(), MyController()]
override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : AnyObject]?) {
super.init(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: options)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
if let firstVC = controllers.first {
setViewControllers([firstVC], direction.Forward, animated: true, completion:nil)
}
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else {
return nil
}
guard orderedViewControllers.count > previousIndex else {
return nil
}
return orderedViewControllers[previousIndex]
}
func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}
let nextIndex = viewControllerIndex + 1
let orderedViewControllersCount = orderedViewControllers.count
guard orderedViewControllersCount != nextIndex else {
return nil
}
guard orderedViewControllersCount > nextIndex else {
return nil
}
return orderedViewControllers[nextIndex]
}
}
查看
class SmallView:UIView {
//Since yours is not a ScrollView I changed to a view. You can add the Pan Gesture here.
var colors:[UIColor] = [UIColor.redColor(), UIColor.blueColor(), UIColor.blackColor()]
convenience init(frame: CGRect, x:Int) {
self.init()
self.frame = frame
self.backgroundColor = colors[x]
setupGesture()
}
func setupGesture() {
let pan = UIPanGestureRecognizer(target: self, action: #selector(SmallView.action))
}
func action(gesture:UIPanGestureRecognizer) {
print("gesture = ", gesture)
}
}
myController的
class MyController:UIViewController {
override func viewDidLoad() {
......
let view = SmallView(frame:CGRect(//some frame here))
self.view.addSubview(view)
}