Как установить высоту на UICollectionView / не допустить расширения UICollectionView в симуляторе - PullRequest
1 голос
/ 28 марта 2019

Использование: Xcode 10.1 beta, Swift 4.2

Я использую автоматическое расположение, чтобы расположить UICollectionView среди других элементов в раскадровке. Прямо над и под UICollectionView есть два «вида», которые имеют высоту 1 (pt? Px? Не уверенный в единицах измерения) и используются как «горизонтальные правила». Когда я открываю приложение на симуляторе iPhone 8, все расставляется так, как я надеялась. Когда я открываю приложение на симуляторе iPhone XR, нижний «вид» растягивается до высоты около 100 (px, pt). Я пытаюсь, чтобы представление UICollection оставалось между двумя 1pt-представлениями на любом размере экрана.

iPhone 8 UICollectionView между 1px 'представлениями', расположенными правильно
iPhone XR с растянутым дном 'view'

Я попытался установить ограничение на высоту UICollectionView, и я получаю эту ошибку:

высота элемента должна быть меньше высоты UICollectionView минус верхние и нижние значения вставок раздела, минус верхние и нижние значения вставок содержимого.

Для ячейки или элемента установлено значение 60 для ширины и высоты. Я попробовал еще меньше, чем на случай, если есть вставки, которые я просто не вижу. Текущие вставки также установлены на 0.

Ниже приведен текущий код, который у меня есть для UICollectionView в моем ViewController:

    extension ProfileViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

  func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
  }

  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.gameImages.count
  }

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "testCell", for: indexPath) as! TestCell
    print("Here is the cell: \(cell)")
    if self.gameImages.count > 0 {
      cell.testImage.image = self.gameImages[0].image
    }
    cell.testImage.frame = CGRect(x: 0, y: 0, width: 76, height: 76)
    cell.testImage.layer.borderWidth = 1
    cell.testImage.layer.masksToBounds = false
    cell.testImage.layer.cornerRadius = cell.testImage.frame.height/2
    cell.testImage.clipsToBounds = true
    return cell
  }

  func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      sizeForItemAt indexPath: IndexPath) -> CGSize {

    return CGSize(width: 76, height: 76)
  }

  func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      minimumLineSpacingForSectionAt section: Int) -> UIEdgeInsets {
//    return UIEdgeInsets(top: 20.0,
//                        left: 20.0,
//                        bottom: 20.0,
//                        right: 20.0)
    return UIEdgeInsets(top: 0.0,
                        left: 0.0,
                        bottom: 0.0,
                        right: 0.0)
//    return 0
  }

  func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {

//    return UIEdgeInsets(top: 20.0,
//                        left: 20.0,
//                        bottom: 20.0,
//                        right: 20.0).left
    return UIEdgeInsets(top: 0.0,
                        left: 0.0,
                        bottom: 0.0,
                        right: 0.0).left
//    return 0
  }

  func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets.init(top: 8, left: 8, bottom: 8, right: 8)
//    return 0
  }

}


class ProfileViewController: UIViewController {

  var gameImages: [UIImageView] = []

  private let sectionInsets = UIEdgeInsets(top: 20.0,
                                           left: 20.0,
                                           bottom: 20.0,
                                           right: 20.0)

  @IBOutlet weak var usernameLabel: UILabel!
  @IBOutlet weak var fullNameLabel: UILabel!
  @IBOutlet weak var descriptionLabel: UILabel!
  @IBOutlet weak var profileImage: UIImageView!
  @IBOutlet weak var chatButton: UIButton!
  @IBOutlet weak var emailButton: UIButton!
  @IBOutlet weak var editProfileButton: UIButton!
  @IBOutlet weak var memberSinceLabel: UILabel!
  @IBOutlet weak var myGamesLabel: UILabel!

  @IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
  profileImage.layer.borderWidth = 1
  profileImage.layer.masksToBounds = false
  profileImage.layer.borderColor = UIColor.black.cgColor
  profileImage.layer.cornerRadius = profileImage.frame.height/2
  profileImage.clipsToBounds = true

  // Set calender image inside memberSince label
  let imageAttachment = NSTextAttachment()
  imageAttachment.image = UIImage(named: "calenderIcon")
  let imageOffsetY: CGFloat = -(imageAttachment.image!.size.height - (self.memberSinceLabel.font?.pointSize)!) / 2.90 // -5.0
  imageAttachment.bounds = CGRect(x: -5, y: imageOffsetY, width: imageAttachment.image!.size.width / 1.5, height: imageAttachment.image!.size.height / 1.5)
  let attachmentString = NSAttributedString(attachment: imageAttachment)
  let completeText = NSMutableAttributedString(string: "")
  completeText.append(attachmentString)

  let textAfterIcon = NSMutableAttributedString(string: "Since " + (MainTabController.user?.memberSince)!)
  completeText.append(textAfterIcon)
  self.memberSinceLabel.textAlignment = .center
  self.memberSinceLabel.attributedText = completeText

  usernameLabel.text = MainTabController.user?.username
  fullNameLabel.text = MainTabController.user?.name
  descriptionLabel.text = MainTabController.user?.description

  var games = MainTabController.user?.myGames

  // Get images from User's object gameImages URL
  if let gamesCount = games?.count {
    for index in 0..<gamesCount {

      let imageName = "image" + String(index)
      let url = URL(string: (MainTabController.user?.myGames[index].imageURL)!)
      downloadImage(from: url!) { (image) in
        var imageView = UIImageView(image: image)
        self.gameImages.append(imageView)
        self.collectionView.reloadData()
      }
    }
  }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "logout" {
        CommonUtils.clearAuthToken()
    }
}

@IBAction func logout(_ sender: UIBarButtonItem) {
    performSegue(withIdentifier: "logout", sender: self)
}

  func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
    URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
  }

  func downloadImage(from url: URL, completion: @escaping (UIImage) -> Void) {
    getData(from: url) { data, response, error in
      guard let data = data, error == nil else { return }
      print(response?.suggestedFilename ?? url.lastPathComponent)
      DispatchQueue.main.async() {
        completion(UIImage(data: data)!)
      }
    }
  }


}

1 Ответ

0 голосов
/ 28 марта 2019

Я исправил эту проблему (визуально), сняв все ограничения, изменив шаблон «телефон» в раскадровке на iPhone XR и сбросив ограничения с помощью автоматического макета.Однако это не устранило ошибку:

высота элемента должна быть меньше высоты UICollectionView минус верхние и нижние значения вставок раздела, минус верхние и нижние значения вставок содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...