Макет сетки с CollectionView в Swift


Я хотел бы добиться такого результата: Введите описание изображения здесь

Поискав вокруг, я обнаружил, что, вероятно, способ сделать это-использовать UICollectionView, так что нет проблем с этим, так как есть много учебных пособий и вопросов по переполнению стека. У меня есть 3 вопроса:

  1. Я ничего не могу найти о "разделителях" (линия, которая разделяет все коробки). Мне нравится, что он не касается границ экрана по горизонтали. Делается ли это программно?

  2. Чтобы разделить пробел одинаково во всех устройствах (3 коробки/кнопки по горизонтали) я нашел этот ответ Ответ. Является ли это правильным подходом?

  3. Для эффекта размытия я нашел такой ответ: Как реализовать UIVisualEffectView в UITableView с адаптивными сегментами

Для A TableView это будет:

if (!UIAccessibilityIsReduceTransparencyEnabled()) {
tableView.backgroundColor = UIColor.clearColor()
let blurEffect = UIBlurEffect(style: .Light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
tableView.backgroundView = blurEffectView
}

Могу ли я сделать что-то подобное?

     @IBOutlet var collectionView: UICollectionView!
    if (!UIAccessibilityIsReduceTransparencyEnabled()) {
    collectionView.backgroundColor = UIColor.clearColor()
    let blurEffect = UIBlurEffect(style: .Light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    collectionView.backgroundView = blurEffectView
    }
5 25

5 ответов:

Создайте UICollectionViewController Вот так в файле, что подклассы из UICollectionViewController:

convenience override init() {
    var layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.itemSize = CGSizeMake(<width>, <height>)
    // Setting the space between cells
    layout.minimumInteritemSpacing = <Space between columns>
    layout.minimumLineSpacing = <Space between rows>
    return (self.init(collectionViewLayout: layout))
}

В viewDidLoad вы задаете цвет фона следующим образом:

self.collectionView.backgroundColor = UIColor.orangeColor()

Я думаю, что вы можете установить фоновое изображение следующим образом:

self.collectionView?.backgroundColor = UIColor(patternImage: UIImage(named: "image.png")!)

Эффект размытия, который вы нашли, выглядит хорошо. Однако мне трудно понять, как это будет работать. Вероятно, установить его с помощью backgroundView собственность.

Я обновлю, если найду ответ.

Обновление:

Вот идея о чем-то, что могло бы работать на размывание клеток.

Создайте класс cocoa-touch, который содержит подклассы из UICollectionViewCell, а затем добавьте к нему следующий код:

convenience override init(frame: CGRect) {
    self.init(frame: frame)
    var blurEffect: UIVisualEffect
    blurEffect = UIBlurEffect(style: .Light)
    var visualEffectView: UIVisualEffectView
    visualEffectView = UIVisualEffectView(effect: blurEffect)
    visualEffectView.frame = self.maskView!.bounds
    self.addSubview(visualEffectView)
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.maskView!.frame = self.contentView.bounds
}

Затем в файле CollectionViewController, в файле viewDidLoad, измените эту строку кода:

self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

Изменить UICollectionViewCell.self на <Name of CollectionViewCell file>.self

Результат:

1) Прежде всего, я думаю, что вам нужно изменить то, как вы смотрите на этот макет. Нет никаких разделителей. Просто ячейки UICollectionView с расстоянием между ячейками, пониженной непрозрачностью и некоторым размытием.

Эти настройки дадут вам что-то близкое к изображению, которое вы опубликовали, вы можете отредактировать его для ваших нужд позже:

На раскадровке перейдите к инспектору размера вашего UICollectionView.
Минимальный Интервал - > Для Ячеек = 2, Для Строк = 2.
Раздел Вставки-> Слева = 7, Справа = 7.

2) я использую это в своем приложении, чтобы разделить пространство поровну на 3 ячейки. Изменил его для ваших настроек. Просто скопируйте / вставьте, и вы можете идти.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        let screenSize: CGRect = UIScreen.mainScreen().bounds
        let screenWidth = screenSize.width
        return CGSize(width: (screenWidth/3)-6, height: (screenWidth/3)-6);
        }
    }

И в качестве последнего шага поместите два изображения поверх CollectionView, слева и справа от вида и сделайте ширину равной 7, а высоту равной UICollectionView. Эти изображения должны иметь одинаковую непрозрачность / фон с ячейками. Это сделает его похожим на изображение, которое вы хотите.
Надеюсь, мой ответ вас устроит. Хорошо удача.

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

UICollectionViewDelegateFlowLayout имеет все методы, которые могут удовлетворить ваши требования.

  1. FlowLayout имеет minimumLineSpacingForSectionAtIndex и minimumInteritemSpacingForSectionAtIndex для задания расстояния между ячейками(как по горизонтали, так и по вертикали).

  2. Это не очень хороший способ дать рамку ячейки в cellForItemAtIndexPath (например, вы отправляете ссылку ответа). Для этот flowLayout предоставляет делегат для определения размера ячейки sizeForItemAtIndexPath.

  3. О третьем вопросе, да, вы можете использовать UIVisualEffectView для размытия цели, но совместим только после iOS 8 и имеет проблему с iPad2 я думаю. Но для вашей проблемы я бы размыл каждую ячейку, а не сам collectionView(так как расстояние между ячейками не размывается).

я не могу найти ничего о "разделителях" (линия, которая разделяет все коробки). Мне нравится, что он не касается границ экрана по горизонтали. Делается ли это программно?

Да, похоже, что он отображается на слое . Вы должны прочитать руководство по программированию Quartz 2D, чтобы получить представление о рисовании и работе со слоями.

чтобы разделить пространство поровну во всех устройствах (3 коробки/кнопки по горизонтали), я нашел этот ответ. Является ли это правильным подходом?

Это было бы вариантом, но не дало бы вам разделители, которые вы любите с вашего снимка экрана.

Я бы поставил backgroundColor вида моей ячейки в clearColor, а затем установил свойство UICollectionView backgroundView в вид, содержащий ваши разделители и эффект размытия. Убедитесь, что свойство backgroundColor объекта UICollectionView имеет значение clearColor.

по поводу третьего вопроса, да можно используйте UIVisualEffectView для размытия цели, но совместим только после iOS 8 и имеет проблему с iPad2 я думаю. Но для вашей проблемы я бы размыл каждую ячейку, а не сам collectionView(так как расстояние между ячейками не размывается).

Если вы используете свойство backgroundView UICollectionView для обработки разделителей и размытия, то вашим ячейкам потребуется только установить backgroundColor в clearColor.

Обратите внимание, что существует несколько способов сделать это, каждый способ будет иметь свои недостатки выберите то, что работает для вас лучше всего.

Я создал этот meethod для пользовательского макета. Вы можете использовать, изменяя в соответствии с вашим запросом.

func setCollectionLayout() {
    let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top:0,left:0,bottom:0,right:0)
    layout.itemSize = CGSize(width: UIScreen.main.bounds.size.width/2 - 1, height: 136)
    layout.minimumInteritemSpacing = 1
    layout.minimumLineSpacing = 1
    collectionView.collectionViewLayout = layout
}