2017-08-31 29 views
0

私は、モーダルでViewControllerを表示する必要があるプロジェクトで作業していますが、scrollviewは正しく動作していないようです。スクロールしません。スクロールビューに直接追加するのではなく、スクロールビュー内にビューを追加して、データを追加しました。私は、スクロールビューのコンテンツサイズがスクロールビューの実際の幅よりもはるかに大きいことを確認しましたが、まだスクロールしません。私は自動レイアウトを無効にして何も変わらない。ここに私のコードです。UIScrollViewはモーダルでスクロールしません。Swift

import Foundation 
import UIKit 

class VenueViewController: UIViewController, UIScrollViewDelegate{ 

    static var marker : Marker = Marker(v: "Error", lat: 1, lon: 1, az: 1, dist: 1000) 

    @IBOutlet weak var viewInsideScrollView: UIView! 
    @IBOutlet weak var dropDownView: UIView! 
    @IBOutlet weak var upcomingEventLabel: UILabel! 
    @IBOutlet var backgroundView: UIView! 
    @IBOutlet weak var venueNameLabel: UILabel! 
    @IBOutlet weak var currentEventLabel: UILabel! 
    @IBOutlet weak var upcomingEventScrollView: UIScrollView! 
    @IBOutlet weak var currentEventImageView: UIImageView! 


    override func viewWillAppear(_ animated: Bool){ 
     super.viewWillAppear(animated) 
     upcomingEventScrollView.isScrollEnabled = true 
     upcomingEventScrollView.showsVerticalScrollIndicator = true 
     upcomingEventScrollView.isUserInteractionEnabled = true 
     upcomingEventScrollView.isPagingEnabled = true 
     dropDownView.isUserInteractionEnabled = true 

     if VenueViewController.marker.getVenueName() == "Error" { 
      return 
     } 


     if !UIAccessibilityIsReduceTransparencyEnabled() { 
      self.backgroundView.backgroundColor = UIColor.clear 
      self.backgroundView.layer.zPosition = 0 
      self.dropDownView.layer.zPosition = 1 
      let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark) 
      let blurEffectView = UIVisualEffectView(effect: blurEffect) 
      blurEffectView.frame = self.backgroundView.bounds 
      blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
      self.backgroundView.addSubview(blurEffectView) 
     } else { 
      self.backgroundView.backgroundColor = UIColor.black 
     } 


     venueNameLabel.text = VenueViewController.marker.getVenueName() 
     currentEventLabel.text = VenueViewController.marker.getEvents()[0].getName() 
     ArtemisHelper.titleImageLoadView(imageView: currentEventImageView, event: VenueViewController.marker.getEvents()[0]) 

     loadUpcomingEvents() 
    } 

    func loadUpcomingEvents(){ 
     for event in VenueViewController.marker.getEvents(){ 
      if event.getName() == currentEventLabel.text{ 
       //continue 
      } 
      let eventTitleLabel : UILabel = UILabel() 
      eventTitleLabel.text=event.getName() + " " + event.getLocalDate() 
      eventTitleLabel.frame.size.width = dropDownView.frame.width 
      eventTitleLabel.frame.size.height = 20 

      eventTitleLabel.frame = CGRect(x: self.viewInsideScrollView.frame.minX, y: self.viewInsideScrollView.bounds.minY, width: self.viewInsideScrollView.frame.width, height: eventTitleLabel.frame.size.height) 

      eventTitleLabel.frame = eventTitleLabel.frame.offsetBy(dx: 0, dy: self.upcomingEventScrollView.contentSize.height) 
      self.viewInsideScrollView.addSubview(eventTitleLabel) 

      self.upcomingEventScrollView.contentSize = CGSize(width: self.upcomingEventScrollView.contentSize.width, height: self.upcomingEventScrollView.contentSize.height+eventTitleLabel.frame.height) 
      self.viewInsideScrollView.frame = CGRect(x: self.upcomingEventScrollView.bounds.minX, y: self.upcomingEventScrollView.bounds.minY, width: self.upcomingEventScrollView.frame.width, height: self.upcomingEventScrollView.contentSize.height) 

     } 
     print(self.viewInsideScrollView.frame.height) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch : UITouch = touches.first! 
     let touchLocation = touch.location(in: self.view) 
     let obstacleViewFrame = self.view.convert(dropDownView.frame, from: dropDownView.superview) 

     if !obstacleViewFrame.contains(touchLocation) { 
      self.dismiss(animated: true, completion: nil) 
     } 
    } 
} 

From the Main Storyboard

答えて

0

作品によってコードピースを離れて取った後、私はDonMagはscrollviewをカバーした透視図があったという意味で正しかったことが分かりました。ここで

self.backgroundView.addSubview(blurEffectView) 

私はサブビューを追加するときに、これは私はscrollviewより低いものにZPOSITIONを設定していてもscrollviewを覆ってしまいます。私はbackgroundViewに隣接するビューを追加し、それにブラー効果ビューを追加しました。これにより、スクロールビューにまだアクセスすることができました。

0

は制約と自動レイアウトを使用することには多くの利点がありますが、あなたは確かにずにを望むものそれを行うことができます。

"ラベルを追加してフレームを設定する"ループは非常に畳み込まれています。このアプローチを見てみましょう:

func loadUpcomingEvents(){ 

    // this is our starting Label frame 
    // at 0,0 and dropDownViewWidth x 20 height 
    var labelRect = CGRect(x: 0, y: 0, width: dropDownView.frame.width, height: 20) 

    for event in VenueViewController.marker.getEvents(){ 

     // instantiate a new label, using the current labelRect for the frame 
     let eventTitleLabel : UILabel = UILabel(frame: labelRect) 

     // set the text of the label 
     eventTitleLabel.text=event.getName() + " " + event.getLocalDate() 

     // add the label to the "inside" view 
     self.viewInsideScrollView.addSubview(eventTitleLabel) 

     // increment the Y position of labelRect by the Height of labelRect 
     labelRect.origin.y += labelRect.size.height 

    } 

    // labelRect is now the frame of the "next label" in the list, 
    // if there was a next label, 
    // so we can use its Y position for the Height of the "inside" view 
    viewInsideScrollView.frame = CGRect(x: 0, y: 0, width: dropDownView.frame.width, height: labelRect.origin.y) 

    // and, we set the scroll view's contentSize to the size of the "inside" view 
    upcomingEventScrollView.contentSize = viewInsideScrollView.frame.size 
} 
+0

scrollView.contentSizeを設定していますか?オートレイアウト設定(有効にしたとき)? –

+0

最後の行は '.contentSize'を設定します。 OPは 'viewInsideScrollView'に自動レイアウト制約を表示しておらず、彼のコードは明らかに何も割り当てていません。 – DonMag

+0

私はこのコードをviewDidLayoutSubviews()にシフトしましたが、まだ動作しませんでした。私は自動レイアウトでもそれを行うべきだと思いましたか? –

関連する問題