【问题标题】:UIScrollView not scrolling in modal, SwiftUIScrollView不在模态中滚动,Swift
【发布时间】:2018-02-09 06:53:05
【问题描述】:

我正在开发一个项目,在该项目中我必须以模态方式显示 ViewController,但是,滚动视图似乎无法正常工作。它不滚动。我没有直接添加到滚动视图,而是在滚动视图中添加了一个视图,然后我会将我的数据添加到其中。我检查了滚动视图的内容大小比滚动视图的实际宽度大得多,但是它并没有滚动。我禁用了自动布局,没有任何变化。这是我的代码。

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)
        }
    }
}

【问题讨论】:

    标签: ios iphone swift xcode uiscrollview


    【解决方案1】:

    在逐段分解代码后,我发现 DonMag 是正确的,因为有一个透明视图覆盖了滚动视图。

        self.backgroundView.addSubview(blurEffectView)
    

    在这里,当我添加子视图时,即使我将 zPosition 设置为低于滚动视图的值,最终也会覆盖滚动视图。我在 backgroundView 旁边添加了一个视图,并在其中添加了模糊效果视图,这样我仍然可以访问滚动视图。

    【讨论】:

      【解决方案2】:

      使用约束和自动布局有很多优点,但您当然可以不使用做任何事情。

      您的“添加标签和设置框架”循环非常复杂。看看这种方法:

      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
      }
      

      【讨论】:

      • 你设置了scrollView.contentSize吗?自动布局设置(启用时)?
      • 最后一行设置.contentSize。 OP 没有在 viewInsideScrollView 上显示任何自动布局约束,他/她的代码显然没有分配任何约束。
      • 我将所有这些代码转移到 viewDidLayoutSubviews() 中,但它仍然无法正常工作,我认为即使使用自动布局也应该如此?
      • 您需要提供更多信息...标签是否显示在您期望的位置?它们是否超出了滚动视图的框架?当它们在屏幕上可见后,您能否在 touchesBegan 函数中设置断点并检查滚动视图的实际框架、滚动视图的 viewInsideScrollView.contentSize 的框架,以确定哪些可能不正确?您是否可能有其他一些透明视图覆盖滚动视图,从而阻止滚动?
      • 滚动视图中的视图显示在它们各自的位置,一切看起来都很好,但是当我在滚动视图上向下拖动时它只是不动。我不认为有一个看不见的层;它不会显示在视图控制器中吗?
      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多