0

ビューの上部にスライド フォト ギャラリー機能を追加しようとしています。

コンテキストを与えるために、ユーザーはボタンや行などをタップします。次に、uistackview を含むスクロールビューをロードします。縦に整理すると、画像があり、次にテキストが含まれる別のスタックビューがありました。今、その画像をより大きな「ギャラリー」の一部にしたいと考えています。私の調査では、UIPageviewcontroller を実装し、他の画像を childVC に追加するように言われました。

これをチュートリアルとして使用しました (最初の例): http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

私のアプリが持っているチュートリアルからの唯一の関連する逸脱は、プログラムで物を作成することです。

ギャラリー機能の概念実証で、前述のスタック ビューと統合したいと考えました。私の計画は、最初に pageviewcontroller のものを全体的なスタック ビューに追加し、そのすぐ下に元の画像ビューを追加してから、元の画像ビューを削除して最終製品を残すことでした。

pageviewcontroller.view を stackview に追加できましたが、ギャラリーが表示されません。UI Inspector を見ると、ギャラリーが少しロードされていることがわかりますが、めちゃくちゃです。

uiview のフレームの高さが 0 であるように見えるため、他のスタック ビュー アイテムは、pageviewcontroller が表示しようとしている画像を尊重しません。

スタックビューは特定のビューのみを処理でき、ページビューコントローラーほど複雑なものではない可能性があると思います。

また、注意してください:私の実装はすべてプログラムであり、ストーリーボードはありません.xibもありません。だから多分私はここで何かを逃した。

それが役立つ場合、ここにいくつかのコードがあります:

表示される制約関数は「地図作成」ポッドからのものであることに注意してください

これはスタックビューに「ギャラリー」を追加します。これは私のビューからのデリゲート関数です

func addZoomStuff(sender: UIStackView) {

let zoomer = PageBaseViewController()
addChildViewController(zoomer)
zoomer.view.translatesAutoresizingMaskIntoConstraints = false
zoomer.view.tag = 5
sender.addArrangedSubview(zoomer.view)
zoomer.didMoveToParentViewController(self)

}

これは、ギャラリー アイテムのスクロール ビュー、イメージ ビューなどを作成するものです。

override func viewDidLoad() {
super.viewDidLoad()
//MARK: - Zoom View Elements

// prep
scrollView = UIScrollView(frame: self.view.frame)
scrollView.delegate = self
self.view.addSubview(scrollView)

constrain(scrollView, view) { view, view2 in
    view.edges == view2.edges
}

self.view.setNeedsUpdateConstraints()

// 1
let image = UIImage(named: imageName)!
imageView = UIImageView(image: image)

// 2
scrollView.addSubview(imageView)

constrain(imageView){ view in
    view.edges == view.superview!.edges
}

scrollView.contentSize = image.size

このような制約を追加しようとしましたが、効果はありませんでした

func addZoomStuff(送信者: UIStackView) {

let zoomer = PageBaseViewController()
addChildViewController(zoomer)
view.addSubview(zoomer.view)
constrain(zoomer.view, view) { view, view2 in
    view.width == view2.width
    view.height == view2.height * 2 / 3
    view.leading == view2.leading
    view.top == view2.top
}
zoomer.view.setNeedsUpdateConstraints()
zoomer.view.removeFromSuperview()
zoomer.view.translatesAutoresizingMaskIntoConstraints = false
zoomer.view.tag = 5
print("sender.subviews: \(sender.subviews)")
sender.addArrangedSubview(zoomer.view)
zoomer.didMoveToParentViewController(self)
print("sender.subviews: \(sender.subviews)")

}

この方法がうまくいかない場合、pageviewcontroller の代わりにネストされた水平スタック ビューを実行して、同じスクロール/スナップ効果を一度に画像ビューで表示することはできますか?

uiinspector_image

4

1 に答える 1

0

TLDR;

  • UIPageViewController のサブクラスを作成し、それを独自のデリゲートにします。
  • プレーンな UIViewController でサブクラスを初期化し、背景色のみを設定します。
  • pageviewcontroller サブクラスで、次および前のビュー コントローラー用の 2 つのデリゲート コールバックを実装します。ランダムな背景色を使用して、単純なビュー コントローラーを作成します。これが機能する場合は、プレーン ビュー コントローラーを実際のコンテンツ ビュー コントローラーに置き換えます。

長いバージョン:

これを見たことがありますか: このリンクが役立つかもしれません: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/PageViewControllers.html UIPageViewController の詳細を説明しているので、役立つかもしれません。基本的に、ギャラリーの 1 ページを表示する viewController (ビューではありません!) を作成する必要があります。したがって、この VC にはスタックビューがあり、そのコンテンツを管理します。pageviewController は、最初の contentviewController で初期化されます。uipageviewcontroller のサブクラスを作成すると、そのサブクラスの self をデリゲートとして設定できます。次または前のviewControllerを返すデリゲートコールバックを実装してください。この最後の部分では、pageviewcontroller のサブクラスが次または前のviewcontroller に設定するデータを把握できる contentviewcontroller のプロパティがあると便利です。

あなたのタイトルは、いくつかの混乱をほのめかそうとしています.viewcontrollerをビューに追加することはできません. 他のビューを (スタック) ビューにのみ追加できます。ビューコントローラーは、ビュー階層を所有および管理します。pageviewcontroller にはコンテンツはありませんが、viewcontroller の挿入と削除を管理します。pageviewcontroller は containerviewcontroller であるため、contentViewcontrollers のビューを取得してビュー階層に配置します。ただし、これは、UIPageViewControlller をサブクラス化し、そのデリゲートをそれ自体に実装するときにコードで行う必要があることではありません (また、デリゲートとして self を割り当てることを忘れないでください)。

于 2015-12-30T06:55:36.860 に答える