我正在开发一个项目,我必须以模态方式显示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)
}
}
}
答案 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附近添加了一个视图,并添加了模糊效果视图,这使我仍然可以访问滚动视图。