Использование: 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)!)
}
}
}
}