UIScrollView没有滚动模态,Swift

时间:2017-08-31 10:35:54

标签: ios iphone swift xcode uiscrollview

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

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

2 个答案:

答案 0 :(得分:0)

使用约束和自动布局有很多好处,但你当然可以做你想要的而不用

你的&#34;添加标签和设置框架&#34;循环是非常复杂的。看看这种方法:

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
}

答案 1 :(得分:0)

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

    self.backgroundView.addSubview(blurEffectView)

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