Пользовательские границы UICollectionViewFlowLayout

Я создал класс Swift, унаследованный от UICollectionViewFlowLayout, и мне удалось успешно сделать некоторые изящные вещи, например, изменить интервал между каждым прямоугольником, который он рисует. Я рисую календарь, поэтому представьте себе 28-31 коробку, по 7 в строке, в зависимости от месяца.

... одна вещь, которую я так и не понял, это как сделать что-то вроде того, чтобы сделать правую границу пустой, а не нет. Или верхняя граница. Недавно я изменил интервал на 0 между каждым блоком, и теперь границы блоков перекрываются.

Я бы хотел программно сделать все правые границы пустыми, чтобы левая граница его следующего действовала как общая граница (так что это не двойная граница). Затем в последнем поле в коллекции для каждой строки я могу сделать так, чтобы у него была правая граница. Знаешь, о чем я говорю? Красивая чистая тонкая рамка вокруг каждой коробки.

Могу ли я сделать это в моем переопределении func layoutAttributesForElementsInRect (rect: CGRect) -> [UICollectionViewLayoutAttributes]? Может, где-нибудь еще?

Спасибо!


person NullHypothesis    schedule 08.11.2015    source источник


Ответы (2)


ХЛОПНУТЬ! Я понял. Это так здорово, потому что теперь я могу программно решить, когда добавлять границы ниже (т.е. если x, то day.layer.addSublayer (topBorder), иначе не добавляйте его)

func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
    {
        let day = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CalendarDayCollectionViewCell

        /* adds a border to entire grid */
        day.layer.borderColor = UIColor.lightGrayColor().CGColor
        //day.layer.borderWidth = 1  //can also do .cornerRadius to round out borders



        //top border
        let topBorder = CALayer()
        topBorder.frame = CGRectMake(0.0, 0.0, day.frame.size.width, 1.0);
        topBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).CGColor


        // bottom border
        let bottomBorder = CALayer()
        bottomBorder.frame = CGRectMake(0.0, day.frame.size.height-1, day.frame.size.width, 1.0);
        bottomBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).CGColor

        let leftBorder = CALayer()
        leftBorder.frame = CGRectMake(0.0, 0.0, 1.0, day.frame.size.height);
        leftBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).CGColor

        let rightBorder = CALayer()
        rightBorder.frame = CGRectMake(day.frame.size.width - 1, 0.0, 1.0, day.frame.size.height);
        rightBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).CGColor

        day.layer.addSublayer(topBorder)
        day.layer.addSublayer(bottomBorder)
        day.layer.addSublayer(leftBorder)
        day.layer.addSublayer(rightBorder)

return day
}
person NullHypothesis    schedule 08.11.2015

Вы не можете явно удалить одну или две стороны границы, что не поддерживается CALayer.

Но, основываясь на этом ответе, вы сможете добиться перекрытия ячеек, так что вы правы, что вам следует переопределить func layoutAttributesForElementsInRect(rect: CGRect)

Кстати, я думаю, вы можете попробовать

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
    let borderWidth = 5
    return UIEdgeInsetsMake(-borderWidth,-borderWidth,-borderWidth,-borderWidth);
}
person zcui93    schedule 08.11.2015
comment
интересно, хорошо, спасибо - а как насчет рисования только одной стороны против другой? Или сделать что-то в func collectionView (collectionView: UICollectionView !, cellForItemAtIndexPath indexPath: NSIndexPath!) - ›UICollectionViewCell! ? - person NullHypothesis; 09.11.2015
comment
Как я уже сказал, CALayer не поддерживает специальную границу, хотя вы можете нарисовать одну сторону границы, взломав. Однако, если вы действительно хотите попробовать это. В cellForItemAtIndexPath , я предлагаю вам попробовать добавить четыре настраиваемых подпредставления, расположенных с четырех сторон, притворяющихся границами. И установить их _3 _ / _ 4_ соответствует indexPath% 7 - person zcui93; 09.11.2015