@RememberMeOne

Как создать несколько UIView через цикл?

Добрый вечер. Пытаюсь разобраться в разработке интерфейсов под Ios.

Стоит задача: через код используя цикл, сгенерировать на экране четыре UIImageView и лейбла.
Выглядеть это должно как товары в интернет-магазине и цена к нему снизу.

Все эти элементы я добавил в отдельный UIView методом addSubview.
Дальше я не особо понимаю как менять данные и расположение элементов при работе в цикле, дабы создать эти оставшиеся 3 элемента рядом с основным.

import UIKit

class SecondViewController: UIViewController {

   var allImages: [UIImage] = [UIImage(named: "Img1")!,
                            UIImage(named: "Img2")!,
                           UIImage(named: "Img3")!,
                          UIImage(named: "Img4")!]
    var i = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myView = UIView(frame: CGRect(x: 30, y: 40, width: 140, height: 240))
        myView.backgroundColor = .gray
        view.addSubview(myView)
        
        let images = UIImageView(frame: CGRect(x: 10, y: 10, width: 120, height: 180))
        images.image = allImages[i]
        myView.addSubview(images)
        
        let myLabel = UILabel(frame: CGRect(x: 10, y: 200, width: 120, height: 25))
        myLabel.backgroundColor = .blue
        myView.addSubview(myLabel)
    
    }
}
  • Вопрос задан
  • 754 просмотра
Решения вопроса 1
ivanvorobei
@ivanvorobei
iOS разработчик, канал https://t.me/sparrowcode
Так как вы написали:

Пытаюсь разобраться в разработке интерфейсов под Ios

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

Назовем один товар ячейкой. Если ячейка должна занимать весь экран от края до края по ширине - используйте UITableView (называют таблицей), если ячеек по ширине может быть несколько - используйте UICollectionView (называют коллекцией).

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

Метод для количества элементов в таблице:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

Как видите, возвращает целое число.

Метод для возрата вью, для таблицы вернуть объект UITableViewCell:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

Просто UIView вернуть нельзя, она не реализует протокол для переиспользования. Но в UITableViewCell можно положить любые вью, которые вы хотите. Это своего рода контейнер. Перед использованием класса ячейки, нужно зарегистрировать класс.

На моем канале есть ролик про переиспользование в таблице. На сайте эпл можно почитать про таблицу и коллекцию.

Это основная концепция. Вам предстоит узнать что такое DataSource, Delegate, размеры, Layout (для коллекции). Не пугайтесь, про это написано много туториалов даже на русском.

P.S. Автор захотел решить задачу с помощью цикла и кодом, привожу пример:
Вынесем значение Y за цикл. Можно объявить здесь же параметры высоты и ширины:
var currentY: CGFloat = 0
let width: CGFloat = 375
let height: CGFloat = 100
        
for i in 0...3 { 

}

В цикле будем генерировать вью и ее настраивать. Лейаут subviews можно сделать там же:
for i in 0...3 {
            var view = UIView()
            view.frame = CGRect.init(x: 0, y: currentY, width: width, height: height)
            currentY += view.frame.height + 10
}

Я приведу только генерацию вьюхи. Как размещать элементы внутри вы уже знаете. 10 - это отступ между вьюхами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы