NSPageController로 페이지 반복

6022 단어 Objective-C코코아
NSPageController 에서 페이지 루프를 구현하는 방법을 생각했습니다.

NSPageController란?



스와이프에 의한 뷰간의 이동을 가능하게 하는 Cocoa용의 클래스입니다. Xcode의 에디터 영역이나 App Store, Spaces의 페이지 이동에는 아마 이것이 사용되고 있습니다.

어떤 방식으로 구현하는지



페이지의 시작과 끝에 각각 끝과 시작 페이지를 삽입합니다.
런타임에는 삽입된 페이지로 이동할 때 해당 페이지를 복사할 페이지로 이동해야 합니다.

예를 들어 A, B, C라는 3장의 페이지가 있다고 하면, 이런 느낌이 됩니다.

후술의 구체예에서는 이 그림과 정확하게는 다릅니다만, 개념적으로는 이런 느낌입니다.

구체적인 예



애플이 공개하고 있는 NSPageController 의 샘플 「 PictureSwiper 」를 만져 구현해 봅니다. PictureSwiper는 여러 장의 사진을 스 와이프하여 페이지 이동으로 볼 수있는 간단한 이미지 뷰어입니다. 이 샘플에 루프를 구현해 보겠습니다.

이번 변경하는 것은 AppDelegate.m 뿐입니다.

먼저 AppDelegateapplicationDidFinishLaunching: 메소드에 아래와 같이 코드 ①, ②를 추가합니다.

applicationDidFinishLaunching
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    /* 
        中略(画像ファイルを読み込み、self.dataにそのデータを詰め込む)
    */

    // ①画像データの先頭と末尾に、末尾と先頭の画像データをそれぞれ挿入する
    id firstData = self.data[0];
    id lastData = self.data[self.data.count - 1];
    [self.data addObject:firstData];
    [self.data insertObject:lastData atIndex:0];

    // set the first image in our list to the main magnifying view
    if ([self.data count] > 0) {
      [self.pageController setArrangedObjects:self.data];
    }

    // ②0ページ目には末尾のページを挿入したので、1ページ目を表示する
    // (selectedIndex: 現在表示中のページのページ番号)
    self.pageController.selectedIndex = 1;
}

그런 다음 AppDelegate(NSPageControllerDelegate) 에 다음 메서드를 추가합니다.

pageController
// ページ移動時にこのメソッドが実行される
- (void)pageController:(NSPageController *)pageController didTransitionToObject:(id)object {

    // 先頭のページに行けば最後から1つ手前のページへ、
    // 最後のページに行けば先頭から1つ手前のページへ、
    // それぞれ移動する
    if (pageController.selectedIndex == 0) {
      pageController.selectedIndex = pageController.arrangedObjects.count - 2;
    }
    else if (pageController.selectedIndex == pageController.arrangedObjects.count - 1) {
      pageController.selectedIndex = 1;
    }
}

좋은 웹페이지 즐겨찾기