質問

隣接ページの一部を表示することを可能にするInterface BuilderのUIPageViewControllerを使用して、ページブラウザを作成しようとしています(別名Peeking)。私は http://www.appcoda.com/uipageviewcontroller-storyboard-storyboard- Tutorial / (そしてそれをSwiftに移植された)は、かなり簡単であるが、画面(そして中心的な)よりも小さいUipageViewControllerにページを表示するための変更がどのような変更になるかを理解することはできません。隣接ページは左右の画面に部分的に表示されます。

IBのページコンテンツビューコントローラのサイズを変更しようとしましたが、ページビューコントローラはまだ画面全体を埋めます。

この機能を網羅するチュートリアルまたは望ましい効果を得るための良いアプローチは何ですか?

竹紙からの下のスクリーンショットは私が達成しようとしているものを示しています...

Enter Image説明

役に立ちましたか?

解決

@Davewが言ったように、PeekingビューはUIScrollViewを使用する必要があります。私もUIPageViewControllerを使用する方法を検索しましたが、リソースが見つかりませんでした。

UIScrollViewを使用して、この機能を想像していた痛みを伴うことはあまりない。


アクションの基本的なコントロールを見るための簡単な例です。

Preview

first:UIViewControllerを作成してから、viewDidLoadメソッドで、次のコードを追加します。

float pad = 20;
NSArray* items = @[@"One", @"Two", @"Three", @"Four"];

self.view.backgroundColor = [UIColor greenColor];

UIScrollView* pageScrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
pageScrollView.opaque = NO;
pageScrollView.showsHorizontalScrollIndicator = NO;
pageScrollView.clipsToBounds = NO;
pageScrollView.pagingEnabled = YES;

adjustFrame(pageScrollView, pad, deviceH()/4, -pad*3, -deviceH()/2);

[self.view addSubview: pageScrollView];

float w = pageScrollView.frame.size.width;

for(int i = 0; i < [items count]; i++){
    UIView* view = [[UIView alloc] initWithFrame:pageScrollView.bounds];
    view.backgroundColor = [UIColor blueColor];
    setFrameX(view, (i*w)+pad);
    setFrameW(view, w-(pad*1));
    [pageScrollView addSubview:view];
}

pageScrollView.contentSize = CGSizeMake(w*[items count], pageScrollView.frame.size.height);
.

FYI、私はこれらを使用しました。私は手動でそれらを3以上のコードで変更することにうんざりします。

更新

私はシンプルなビューコントローラでこのコードを折り返してgithub

に入れる

https://github.com/kjantzer/peek-page-view-Controller.

それは決して完全ではありませんが、それは作業開始です。

他のヒント

私は同じ機能を同じにどおりの解決策を検索していました。私はRay Wenderlichのサイトの素晴らしいチュートリアルを見つけました。>「UISCrollViewを使用してコンテンツをスクロールしてズームコンテンツを使用する方法」。それはUIScrollViewであなたができることが複数のものです。4番目と最後は、「Peek」機能である「前/次のページの表示」です。

私はまだこれを実装していませんが、重要なステップは次のようです:

  • 画面
  • より狭いUIScrollViewを作成する
  • Paging Enabled
  • をオンにする
  • Clip Subviews
  • をオフにする
  • PagesをSIDEY
  • でPagesで埋めます。
  • スクロールビューの外側にキャプチャして渡すことができるように、画面の幅を埋めるUIScrollView内にUIScrollViewを埋め込みます。

私はSwift 4でKevin Jantzerの答えを書き換え、うまくいきます!

override func viewDidLoad() {
    super.viewDidLoad()
    let pad: CGFloat = 20
    let items: [UIColor] = [.blue, .yellow, .red, .green]

    self.view.backgroundColor = .white

    var pageScrollView = UIScrollView(frame: self.view.frame)
    pageScrollView.isOpaque = false
    pageScrollView.showsHorizontalScrollIndicator = false
    pageScrollView.clipsToBounds = false
    pageScrollView.isPagingEnabled = true
    adjustFrame(myView: pageScrollView, x: pad, y: UIScreen.main.bounds.height / 4, w: -pad * 3, h: -UIScreen.main.bounds.height/2)

    self.view.addSubview(pageScrollView)
    let w = pageScrollView.frame.size.width

    for (i, item) in items.enumerated() {
        let myView = UIView(frame: pageScrollView.bounds)
        myView.backgroundColor = item
        setFrameX(myView: myView, x: (CGFloat(i) * w) + pad);
        setFrameW(myView: myView, w: w-(pad*1));
        pageScrollView.addSubview(myView)
    }

    pageScrollView.contentSize = CGSize(width: w * CGFloat(items.count), height: pageScrollView.frame.size.height);
}

func setFrame(myView: UIView, x: CGFloat?, y: CGFloat?, w: CGFloat?, h: CGFloat?){
    var f = myView.frame

    if let safeX = x {
        f.origin = CGPoint(x: safeX, y: f.origin.y)
    }
    if let safeY = y {
        f.origin = CGPoint(x: f.origin.x, y: safeY)
    }
    if let safeW = w {
        f.size.width = safeW
    }
    if let safeH = h {
        f.size.height = safeH
    }

    myView.frame = f
}

func setFrameX(myView: UIView, x: CGFloat) {
    setFrame(myView: myView, x: x, y: nil, w: nil, h: nil)
}
func setFrameY(myView: UIView, y: CGFloat) {
    setFrame(myView: myView, x: nil, y: y, w: nil, h: nil)
}
func setFrameW(myView: UIView, w: CGFloat) {
    setFrame(myView: myView, x: nil, y: nil, w: w, h: nil)
}
func setFrameH(myView: UIView, h: CGFloat) {
    setFrame(myView: myView, x: nil, y: nil, w: nil, h: h)
}

func adjustFrame(f: CGRect, x: CGFloat?, y: CGFloat?, w: CGFloat?, h: CGFloat?) -> CGRect {
    var rect = f

    if let safeX = x {
        rect.origin = CGPoint(x: rect.origin.x + safeX, y: f.origin.y)
    }
    if let safeY = y {
        rect.origin = CGPoint(x: f.origin.x, y: rect.origin.y + safeY)
    }
    if let safeW = w {
        rect.size.width = safeW + rect.size.width
    }
    if let safeH = h {
        rect.size.height = safeH + rect.size.height
    }

    return rect
}

func adjustFrame(myView: UIView, x: CGFloat, y: CGFloat, w: CGFloat, h: CGFloat) {
    myView.frame = adjustFrame(f: myView.frame, x: x, y: y, w: w, h: h);
}
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top