UIPageViewController의 스 와이프 동작을 어떻게 비활성화합니까?
내 경우에는 부모 UIViewController
가 UIPageViewController
포함 UINavigationController
하는 포함 UIViewController
합니다. 마지막 뷰 컨트롤러에 스 와이프 제스처를 추가해야하지만 스 와이프는 마치 페이지 뷰 컨트롤러에 속하는 것처럼 처리됩니다. 프로그래밍 방식과 xib를 통해이 작업을 시도했지만 결과는 없습니다.
내가 이해하는 것처럼 UIPageViewController
제스처를 처리 할 때까지 목표를 달성 할 수 없습니다 . 이 문제를 해결하는 방법?
UIPageViewController
스크롤 을 방지하는 문서화 된 방법 은 dataSource
속성을 할당하지 않는 것 입니다. 데이터 소스를 할당하면이를 방지하려는 '제스처 기반'탐색 모드로 이동합니다.
데이터 소스가없는 경우 setViewControllers:direction:animated:completion
방법 을 원할 때 수동으로 뷰 컨트롤러를 제공하면 필요 에 따라 뷰 컨트롤러간에 이동할 수 있습니다.
위의 내용은 Apple의 UIPageViewController 문서 (개요, 두 번째 단락) 에서 추론 할 수 있습니다 .
제스처 기반 탐색을 지원하려면 데이터 소스 객체를 사용하여 뷰 컨트롤러를 제공해야합니다.
for (UIScrollView *view in self.pageViewController.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
view.scrollEnabled = NO;
}
}
user2159978의 답변 을 Swift로 번역합니다.
func removeSwipeGesture(){
for view in self.pageViewController!.view.subviews {
if let subView = view as? UIScrollView {
subView.scrollEnabled = false
}
}
}
@lee (@ user2159978) 솔루션을 확장으로 구현 :
extension UIPageViewController {
var isPagingEnabled: Bool {
get {
var isEnabled: Bool = true
for view in view.subviews {
if let subView = view as? UIScrollView {
isEnabled = subView.isScrollEnabled
}
}
return isEnabled
}
set {
for view in view.subviews {
if let subView = view as? UIScrollView {
subView.isScrollEnabled = newValue
}
}
}
}
}
사용법 : (에서 UIPageViewController
)
self.isPagingEnabled = false
편집 :이 답변은 페이지 말림 스타일에만 적용됩니다. Jessedc의 대답 은 훨씬 낫습니다. 스타일에 관계없이 작동하며 문서화 된 동작에 의존합니다 .
UIPageViewController
동작 인식기 배열을 표시하며이를 사용하지 않도록 설정할 수 있습니다.
// myPageViewController is your UIPageViewController instance
for (UIGestureRecognizer *recognizer in myPageViewController.gestureRecognizers) {
recognizer.enabled = NO;
}
나는 이것을 잠시 동안 싸워 왔고 Jessedc의 대답에 따라 해결책을 게시해야한다고 생각했다. PageViewController의 데이터 소스를 제거합니다.
내 PgeViewController 클래스에이를 추가 (스토리 보드에 내 페이지 뷰 컨트롤러에 연결, 상속 둘 UIPageViewController
과 UIPageViewControllerDataSource
) :
static func enable(enable: Bool){
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let pageViewController = appDelegate.window!.rootViewController as! PgeViewController
if (enable){
pageViewController.dataSource = pageViewController
}else{
pageViewController.dataSource = nil
}
}
그런 다음 각 하위 뷰가 나타날 때 호출 할 수 있습니다 (이 경우 비활성화).
override func viewDidAppear(animated: Bool) {
PgeViewController.enable(false)
}
나는 이것이 누군가를 도울 수 있기를 바랍니다. 원하는만큼 깨끗하지는 않지만 너무 해킹되지는 않습니다.
편집 : 누군가 이것을 Objective-C로 번역하려면 :)
If you want your UIPageViewController
to maintain it's ability to swipe, while allowing your content controls to use their features (Swipe to delete, etc), just turn off canCancelContentTouches
in the UIPageViewController
.
Put this in your UIPageViewController
's viewDidLoad
func. (Swift)
if let myView = view?.subviews.first as? UIScrollView {
myView.canCancelContentTouches = false
}
The UIPageViewController
has an auto-generated subview that handles the gestures. We can prevent these subviews from cancelling content gestures.
From...
Swipe to delete on a tableView that is inside a pageViewController
A useful extension of UIPageViewController
to enable and disable swipe.
extension UIPageViewController {
func enableSwipeGesture() {
for view in self.view.subviews {
if let subView = view as? UIScrollView {
subView.isScrollEnabled = true
}
}
}
func disableSwipeGesture() {
for view in self.view.subviews {
if let subView = view as? UIScrollView {
subView.isScrollEnabled = false
}
}
}
}
I solved it like this (Swift 4.1)
if let scrollView = self.view.subviews.filter({$0.isKind(of: UIScrollView.self)}).first as? UIScrollView {
scrollView.isScrollEnabled = false
}
Similar to @user3568340 answer
Swift 4
private var _enabled = true
public var enabled:Bool {
set {
if _enabled != newValue {
_enabled = newValue
if _enabled {
dataSource = self
}
else{
dataSource = nil
}
}
}
get {
return _enabled
}
}
Swifty way for @lee answer
extension UIPageViewController {
var isPagingEnabled: Bool {
get {
return scrollView?.isScrollEnabled ?? false
}
set {
scrollView?.isScrollEnabled = newValue
}
}
var scrollView: UIScrollView? {
return view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView
}
}
Translating @user2159978's response to C#:
foreach (var view in pageViewController.View.Subviews){
var subView = view as UIScrollView;
if (subView != null){
subView.ScrollEnabled = enabled;
}
}
Thanks to @user2159978's answer.
I make it a little more understandable.
- (void)disableScroll{
for (UIView *view in self.pageViewController.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
UIScrollView * aView = (UIScrollView *)view;
aView.scrollEnabled = NO;
}
}
}
(Swift 4) You can remove gestureRecognizers of your pageViewController:
pageViewController.view.gestureRecognizers?.forEach({ (gesture) in
pageViewController.view.removeGestureRecognizer(gesture)
})
If you prefer in extension:
extension UIViewController{
func removeGestureRecognizers(){
view.gestureRecognizers?.forEach({ (gesture) in
view.removeGestureRecognizer(gesture)
})
}
}
and pageViewController.removeGestureRecognizers
Declare it like this:
private var scrollView: UIScrollView? {
return pageViewController.view.subviews.compactMap { $0 as? UIScrollView }.first
}
Then use it like this:
scrollView?.isScrollEnabled = true //false
'IT박스' 카테고리의 다른 글
번 들러와 함께 --no-rdoc 및 --no-ri 사용 (0) | 2020.07.24 |
---|---|
문자열 길이를 기준으로 문자열 자르기 (0) | 2020.07.24 |
SQL DATE에서 월과 연도 만 가져 오기 (0) | 2020.07.24 |
objective-c에서 NSURL의 일부 가져 오기 (0) | 2020.07.24 |
Android 4.3 메뉴 항목 showAsAction =“항상”무시 (0) | 2020.07.24 |