Swift FSCalendar Interactive Scope Gesture программно - PullRequest
0 голосов
/ 21 июня 2020

Я использую FSCalendar для создания календаря для своего приложения, но не могу заставить Interactive Scope Gesture работать. Я загрузил пример проекта и прочитал документацию, но он все равно вылетает с этой ошибкой Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value в строке calendarHeightConstraint.constant = 350. Все, что я пытаюсь достичь, точно такое же, как показано в документации, с помощью Interactive Scope Gesture , но программно.

var calendarHeightConstraint: NSLayoutConstraint!

let calendarView: FSCalendar = {
    let cl = FSCalendar()
    cl.allowsMultipleSelection = false
    return cl
}()

let collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
    cv.backgroundColor = UIColor(named: "backgroundColor")
    cv.showsVerticalScrollIndicator = false
    cv.showsHorizontalScrollIndicator = false
    return cv
}()

fileprivate lazy var scopeGesture: UIPanGestureRecognizer = {
    [unowned self] in
    let panGesture = UIPanGestureRecognizer(target: self.calendarView, action: #selector(self.calendarView.handleScopeGesture(_:)))
    panGesture.delegate = self
    panGesture.minimumNumberOfTouches = 1
    panGesture.maximumNumberOfTouches = 2
    return panGesture
}()

override func viewDidLoad() {
    super.viewDidLoad()
    
    view.backgroundColor = UIColor(named: "backgroundColor")
    collectionView.delegate = self
    collectionView.dataSource = self
    calendarView.delegate = self
    calendarView.dataSource = self
    
    calendarHeightConstraint.constant = 350

    self.calendarView.select(Date())
    
    self.view.addGestureRecognizer(self.scopeGesture)
    self.calendarView.addGestureRecognizer(self.scopeGesture)
    self.calendarView.scope = .week
    
    setupLayout()
    setupCollectionView()
}

func setupLayout() {
    
    view.addSubview(calendarView)
    calendarView.anchor(top: topLayoutGuide.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 75, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: view.frame.width, height: 350)

    view.addSubview(collectionView)
    collectionView.anchor(top: calendarView.bottomAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 15, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
}

func setupCollectionView() {
    
    collectionView.register(CalendarCollectionCell.self, forCellWithReuseIdentifier: cellId)
    collectionView.dataSource = self
    collectionView.delegate = self
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! CalendarCollectionCell
    
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: view.frame.width, height: 70)
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 15
}

func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) {
    self.calendarHeightConstraint.constant = bounds.height
    self.view.layoutIfNeeded()
}

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Вы не инициализируете

 var calendarHeightConstraint: NSLayoutConstraint!

или не связываете его как розетку, следовательно, это ноль, вам нужно связать его здесь

calendarView.anchor(top: topLayoutGuide.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 75, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: view.frame.width, height: 350)

, чтобы вы могли играть с ним constant по мере необходимости, поэтому вы можете использовать

NSLayoutConstraint.activate([
   // add left , right and top constraints
])

в дополнение к

calendarHeightConstraint = calendarView.heightAnchor.constraint(equalToConstant: 350)
calendarHeightConstraint.isActive = true

Не пытайтесь использовать calendarHeightConstraint перед двумя вышеуказанными строками, так как это даст ноль cra sh

0 голосов
/ 21 июня 2020

Вы можете исправить это, выполнив две операции.

  1. Удалите строку calendarHeightConstraint.constant = 350 из viewDidLoad.

  2. Инициализируйте calendarHeightConstraint дюйм setupLayout.

Вместо:

calendarView.anchor(top: topLayoutGuide.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 75, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: view.frame.width, height: 350)

Используйте:

calendarView.anchor(top: topLayoutGuide.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 75, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: view.frame.width, height: 0)
calendarHeightConstraint = calendarView.heightAnchor.constraint(equalToConstant: 350)
calendarHeightConstraint.isActive = true
...