development

UIPageViewController에서 점 숨기기

big-blog 2020. 12. 31. 23:23
반응형

UIPageViewController에서 점 숨기기


아주 간단한 일을하고 싶습니다. 모든 점과 UIPageViewController 하단의 막대를 제거하십시오.

이것은 설정입니다. UIPageViewController * pageController가있는 사용자 정의보기 컨트롤러가 있습니다. 다음과 같이 표시합니다.

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

self.pageController.dataSource = self;
[[self.pageController view] setFrame:[self.view bounds]];

BSItemPageViewController *initialViewController = [self viewControllerAtIndex:selectedIndex];

NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];

점을 제거하는 방법에 대한 아이디어가 있습니까?


페이지 제어는 데이터 소스가 다음 메소드를 구현하는 경우에만 표시됩니다.

presentationCountForPageViewController:
presentationIndexForPageViewController:

이러한 구현을 제거하기 만하면 페이지 컨트롤이 표시되지 않습니다. 에서 데이터 소스 문서 :

"페이지 표시기 지원"의 두 메서드가 모두 구현되고 페이지보기 컨트롤러의 전환 스타일이 UIPageViewControllerTransitionStyleScroll이면 페이지 표시기가 표시됩니다.


제 상황에서는 여러 UIPageViewControllers (-[UITableView didSelectRowAtIndexPath]에서 생성됨)가 있으며, 그중 일부에는 1 페이지 만 포함되어 있습니다. 다른 UITableView 행에 다른 컨트롤러를 사용하는 대신 다음과 같이 UIPageViewController 대리자 메서드를 구현했습니다.

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
    return ([self numberOfPages] == 1 ? 0 : [self numberOfPages]);
}

UIPageViewController가 점을 표시하지 않는 것처럼 보이는 페이지가 1 개뿐이면 0을 반환합니다. kludge이지만 작동하는 것처럼 보입니다 (iOS SDK 7.0).

"더 깨끗한"방법은 페이지가 1 개 뿐인 UIPageController에 대해 런타임에 메서드를 제거하는 것이지만 이것은 멋진 objC 런타임 조작을 포함합니다.

이 접근 방식에 대한 의견이 있으십니까?


런타임에 이러한 점을 동적으로 숨기려면 presentationIndexForPageViewController 대리자에서 -1을 반환합니다.

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count > 1 ? 0 : -1
}

이 경우 1 (단면) 페이지 만 있으면 점이 숨겨집니다.


위의 수정 사항은 처음에 고정 된 페이지 수에서 제대로 작동합니다.

페이지를 동적으로 늘리거나 줄일 수있는 문제를 해결하기 위해 여러 가지 방법을 시도했습니다 .

그래서 나는 수동으로 구성 요소 자체를 숨기는 방법을 사용했습니다.

func togglePageControl(pageCount: Int, threshold: Int = 1) {

    var hidden = true

    if pageCount > threshold {

        hidden = false

    }

    for subView in self.view.subviews {
        if subView is UIScrollView {
            subView.frame = self.view.bounds
        } else if subView is UIPageControl {
            subView.isHidden = hidden
        }
    }
}

그리고 이것은

public func presentationCount(for pageViewController: UIPageViewController) -> Int {

    togglePageControl(pageCount: pages.count)

    // or togglePageControl(pageCount: pages.count, threshold: 5)

    return pages.count
}

Lee가 지적했듯이 presentationCountForPageViewControllerpresentationCountForPageViewController 메서드를 구현하지 않으면 음성 해설 중에 페이지 번호 (1/5, 2/5 등)를 읽지 못하는 접근성 문제가 발생합니다. 접근성을 지원하는 솔루션은 다음과 같습니다.

// Swift
let proxy = UIPageControl.appearance()
proxy.isHidden = true

// Objective-C
UIPageControl *proxy = [UIPageControl appearance];
[proxy setHidden:YES];

이것은 데이터 소스와 그 프리젠 테이션 사이의 명확한 분리를 유지하는 추가적인 이점이 있습니다.

UPDATE: This is unfortunately not a perfect solution since it hides the control but doesn't remove it (there remains an empty space the same height of the hidden control). I haven't yet been able to find a way to configure the existing control to fix this issue.

ReferenceURL : https://stackoverflow.com/questions/20748897/hide-dots-from-uipageviewcontroller

반응형