UICollectionViewFlowLayout MinimumLineSpacing не применяется ко всему представлению коллекции – Swift

Я создаю подкласс UIView для календаря, в котором UICollectionView с макетом потока используется для отображения дат. Код:

    override func draw(_ rect: CGRect)
    {
        super.draw(rect)
        .
        .

        configureCalendarView()
        .
    }



    func configureCalendarView()
    {
        cellWd = Double(self.frame.size.width)/7.0

        let layout = UICollectionViewFlowLayout.init()
        layout.minimumLineSpacing = 0.5
        layout.minimumInteritemSpacing = 0.0
        layout.sectionInset = UIEdgeInsetsMake(1, 0, 0, 0)

        collectionV = UICollectionView.init(frame: CGRect(x: 0, y:90, width:self.frame.size.width, height:CGFloat(cellWd * 5 + 3.5)), collectionViewLayout: layout)
        collectionV?.backgroundColor = self.backgroundColor
        collectionV?.isScrollEnabled = false
        collectionV?.register(DayCell.classForCoder(), forCellWithReuseIdentifier:reuseID)
        collectionV?.dataSource = self;
        collectionV?.delegate = self;
        collectionV?.backgroundColor = calBgColor  //lightgray
        self.addSubview(collectionV!)
    }

Все работает нормально, но минимальный межстрочный интервал не имеет никакого эффекта между 2-й и 3-й строкой. Ниже скриншот:

введите здесь описание изображения

Что происходит не так? Любая помощь будет принята с благодарностью. Благодарю вас !


person iAkshay    schedule 16.01.2017    source источник


Ответы (1)


layout.minimumLineSpacing = 0,5 переводится как 0,5 пункта * масштаб = пиксели.

Так что, если вы работаете на iphone 6+ 7+ с масштабом 3.0, 0,5 будет 1,5 пикселя. И в масштабе 2x это будет 1 пиксель. Чтобы исправить это. Добавь это:

layout.minimumLineSpacing = 1.0/[UIScreen mainScreen].scale; Таким образом, вы гарантированно всегда получаете интервал в 1 пиксель.

Редактировать:

layout.minimumLineSpacing = 1.0f;

CGFloat collectionWidth = self.frame.size.width;
CGFloat days = 7.0f;
CGFloat spacing = 1.0f;

CGFloat itemHeight = floorf((collectionWidth/days) - spacing;
person Community    schedule 16.01.2017
comment
CGFloat(cellWd * 5 + 3.5)) здесь тоже надо исправить расчет, + 5.0/screenScale - person ; 16.01.2017
comment
попытался изменить это тоже, но он просто увеличивает нижнюю границу, так как высота представления коллекции увеличивается (и цвет фона светло-серый) - person iAkshay; 16.01.2017
comment
удалите свой layout.sectionInset = UIEdgeInsetsMake(1, 0, 0, 0), сделайте его UIEdgeInsetsZero . Это дает вам постоянную вставку в 1 точку (2 пикселя) сверху, поэтому вместо этого она добавляется снизу. Если вам нужна верхняя вставка, вы также должны учитывать это в своих расчетах. - person ; 16.01.2017
comment
все еще не работает ^. На самом деле, если я установлю минимальный межстрочный интервал равным 1,0, тогда строка появится как 0,5. Поэтому, если я устанавливаю минимальный межстрочный интервал равным 0,5, он отображается как 0. Таким образом, в основном разница составляет 0,5 только ниже второй строки. - person iAkshay; 16.01.2017
comment
Что-то не так с вашими расчетами. Если вы установите его на 1,0, а строка будет отображаться как 0,5, это означает, что у вас недостаточно общего места в collectionview.frame для расчетов, чтобы соответствовать интервалам. Таким образом, интервал сжимается вместе, и в зависимости от ваших пикселей экрана вы увидите 1 пиксель (0,5, как вы говорите) или 0 пикселей (если вы установите его 0,5, как вы это говорите). Таким образом, фактическая ошибка может быть в вашем sizeForItemAtIndexPath, который вы не показываете в своем коде выше. Вы должны убедиться, что высота вашей ячейки рассчитана с учетом интервала. - person ; 16.01.2017
comment
Да, так и думал, но почему это происходит только ниже строки 2? И в моем коде я взял 'cellWd' для размера ячейки как CGSize(width:cellWd, height:cellWd) - person iAkshay; 16.01.2017
comment
Пиксели не подходят, поэтому это может произойти везде, где внутренние вычисления захотят. Я предполагаю, что у вас есть масштаб устройства в 2-кратном масштабе, поэтому вы видите 1 пиксель, когда вы меняете его на 1,0 интервал, поскольку 0,5/масштаб составляет 0,25 пикселя, он не будет отображаться на экране. Вы могли бы просто сделать еще лучше. сделайте интервал = 0 и просто измените высоту ячейки на cellWd - (1.0f/масштаб), и вы получите интервал с идеальным 1 пикселем :) и просто измените фон коллекции, вы получите цвет интервала - person ; 16.01.2017
comment
как вы сказали, «сделайте интервал до = 0»: это удаление пространства независимо от высоты ячейки. - person iAkshay; 16.01.2017
comment
@iAkki Я обновил свой ответ формулой. Попробуйте и посмотрите, работает ли это для вас. - person ; 16.01.2017
comment
Давайте продолжим это обсуждение в чате. - person ; 16.01.2017
comment
Это исправило! floor был ключом. просто изменил sizeForItemAt на return CGSize(width:cellWd, height:floor(cellWd) - 0.5) и все заработало. Большое спасибо ! - person iAkshay; 16.01.2017