8

UIPageViewControllerナビゲーションを水平に設定し、トランジションスタイルをスクロールに設定して(InterfaceBuilderで)、スパインを使用していません。それは私に統合された素敵なUIPageControlを与えます。次に、表示するかどうかを切り替えられるようにします(その下にアートワークがあるため)。

を非表示にすることになっているときに設定presentationCountForPageViewControllerpresentationIndexForPageViewControllerて0を返すようにしましUIPageControlたが、これらのメソッドが必要なときに呼び出されていません。

スタックトレースを一時停止すると、それらが呼び出されているのがわかります[UIPageViewController _updatePageControlViaDataSourceIfNecessary]...そのメソッドを使用しようとすると、アプリが拒否されると思います。

サブビューを探し回る必要がありますか、それとも自分でロールして制御できるようにする必要がありますか、それとも表示を切り替えるためのより良い方法がありますか?

ありがとう!

4

8 に答える 8

17

私は、サブビューを探し回ると言います。このコードは、サブビュー階層で UIPageControl を正常に検出します。

NSArray *subviews = pageController.view.subviews;
UIPageControl *thisControl = nil;
for (int i=0; i<[subviews count]; i++) {
    if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) {
        thisControl = (UIPageControl *)[subviews objectAtIndex:i];
    }
}

これを使用してドットの色をカスタマイズしています。アルファ値で同じことを行ったり、背面などに送信したりできると思います。

Apple は、UIPageViewController クラスを介して UIPageControl への直接的なインターフェイスを提供していませんが、それに到達するために必要な不正なメソッド呼び出しはありません...なぜこれがアプリの拒否につながるのかわかりません。

于 2013-08-03T04:28:25.777 に答える
4

を使用してすべての PageControl オブジェクトに対してこれにアクセスできますがappearance( UIAppearance プロトコルを参照)、特定のインスタンスを取得するには、再帰を使用する必要があります。スウィフトコード:

let pageControl = UIPageControl.appearance()
于 2015-06-07T21:13:03.683 に答える
3

スウィフトでは:

    let subviews: Array = self.pageViewController.view.subviews
    var pageControl: UIPageControl! = nil

    for (var i = 0; i < subviews.count; i++) {
        if (subviews[i] is UIPageControl) {
            pageControl = subviews[i] as! UIPageControl
            break
        }
    }
于 2015-05-23T15:54:39.900 に答える
2

これを処理するためのカテゴリを実装しました。これにより、コードが混乱し、「pageController.pageControl」を介して pageControl にアクセスできるようになります。

Objective-C

// Header
@interface UIPageViewController (PageControl)

@property (nonatomic, readonly) UIPageControl *pageControl;

@end

また、Apple が実装を変更して UIPageControl がサブビューの最初のレイヤーに含まれないようにすることを決定した場合に備えて、(ブロックによって処理される) 再帰を使用しました。

// Implementation
#import "UIPageViewController+PageControl.h"

@implementation UIPageViewController (PageControl)

- (UIPageControl *)pageControl
{
    __block UIPageControl *pageControl = nil;
    void (^pageControlAssignBlock)(UIPageControl *) = ^void(UIPageControl *blockPageControl) {
        pageControl = blockPageControl;
    };

    [self recurseForPageControlFromSubViews:self.view.subviews withAssignBlock:pageControlAssignBlock];

    return pageControl;
}

- (void)recurseForPageControlFromSubViews:(NSArray *)subViews withAssignBlock:(void (^)(UIPageControl *))assignBlock
{
    for (UIView *subView in subViews) {
        if ([subView isKindOfClass:[UIPageControl class]]) {
            assignBlock((UIPageControl *)subView);
            break;
        } else {
            [self recurseForPageControlFromSubViews:subView.subviews withAssignBlock:assignBlock];
        }
    }
}

@end

これはあなたのニーズにはやり過ぎかもしれませんが、私の場合はうまくいきました

于 2015-05-29T05:51:56.710 に答える