Middle
Чӣ гуна имкон дорад, ки функсионалиятро барои гирифтани индекси сутун, ки ба он тап карда шудааст, ва тағир додани рангии сутуни дигар дар доираи даҳ сутун ва панҷ блок амалӣ кард?
sobes.tech AI
Ҷавоб аз AI
Используя UICollectionView или UITableView.
Для UICollectionView:
- Реализовать делегата
UICollectionViewDelegate. - В методе
collectionView(_:didSelectItemAt:)получитьindexPath.item(индекс колонки в секции). - Определить индекс другой колонки для изменения цвета (например,
indexPath.item + 1или заданный индекс). - Получить ячейку по этому другому индексу с помощью
collectionView.cellForItem(at: IndexPath(item: другой_индекс, section: indexPath.section)). - Изменить цвет фона или другого элемента ячейки.
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let tappedColumnIndex = indexPath.item
print("Тап по колонке с индексом: \(tappedColumnIndex)")
// Пример: изменить цвет следующей колонки
let nextColumnIndex = tappedColumnIndex + 1
if nextColumnIndex < collectionView.numberOfItems(inSection: indexPath.section) {
let nextIndexPath = IndexPath(item: nextColumnIndex, section: indexPath.section)
if let cell = collectionView.cellForItem(at: nextIndexPath) {
// Изменяем цвет фона ячейки
cell.contentView.backgroundColor = .blue
}
}
}
Для UITableView с несколькими секциями, каждая представляющая блок, и ячейками в секции, представляющими колонки:
- Реализовать делегата
UITableViewDelegate. - В методе
tableView(_:didSelectRowAt:)получитьindexPath.row(индекс колонки в блоке) иindexPath.section(индекс блока). - Определить индекс другой колонки для изменения цвета (например,
indexPath.row + 1) в том же или другом блоке. - Получить ячейку по этому другому индексу с помощью
tableView.cellForRow(at: IndexPath(row: другой_индекс_колонки, section: другой_индекс_блока)). - Изменить цвет фона или другого элемента ячейки.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let tappedColumnIndex = indexPath.row
let tappedBlockIndex = indexPath.section
print("Тап по колонке \(tappedColumnIndex) в блоке \(tappedBlockIndex)")
// Пример: изменить цвет следующей колонки в том же блоке
let nextColumnIndex = tappedColumnIndex + 1
if nextColumnIndex < tableView.numberOfRows(inSection: indexPath.section) {
let nextIndexPath = IndexPath(row: nextColumnIndex, section: indexPath.section)
if let cell = tableView.cellForRow(at: nextIndexPath) {
// Изменяем цвет фона ячейки
cell.contentView.backgroundColor = .red
}
}
}
Важные нюансы:
- Для правильного отображения изменений цвета при повторном использовании ячеек (dequeuing) необходимо сохранить состояние (какие колонки изменены) и применять его в методах
collectionView(_:cellForItemAt:)илиtableView(_:cellForRowAt:). - Вместо изменения цвета самой ячейки, лучше изменять цвет представления внутри нее (например,
contentView.backgroundColor). - При десяти колонках и пяти блоках,
UICollectionViewс настройками для горизонтального скролла (илиUIStackViewвнутриUITableViewCell) может быть более подходящим архитектурным решением, представляя колонки как элементы внутри ячеек. - Если "пять блоков" подразумевают 5 независимых наборов из 10 колонок, то
UITableViewс 5 секциями, каждая из которых содержит 10 ячеек, тоже является рабочим вариантом. UIStackViewвнутри ячейкиUITableViewCellилиUICollectionViewCellможет представлять 10 колонок, и при тапе на один из subviews (представляющий колонку), можно определить его индекс и изменить цвет другого subview. Для определения тапа на subview вUIStackViewможно использоватьUITapGestureRecognizer.
// Пример с UITextField в UIStackView внутри UITableViewCell
class ColumnCell: UITableViewCell {
let stackView = UIStackView()
var columnTappedHandler: ((Int, Int) -> Void)? // (blockIndex, columnIndex)
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupStackView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupStackView() {
stackView.axis = .horizontal
stackView.distribution = .fillEqually
contentView.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
stackView.topAnchor.constraint(equalTo: contentView.topAnchor),
stackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
])
// Добавляем 10 текстовых полей как колонки
for i in 0..<10 {
let textField = UITextField()
textField.borderStyle = .roundedRect
textField.textAlignment = .center
// Добавляем распознаватель жестов
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleColumnTap(_:)))
textField.addGestureRecognizer(tapGesture)
textField.isUserInteractionEnabled = true
textField.tag = i // Идентификатор колонки
stackView.addArrangedSubview(textField)
}
}
@objc private func handleColumnTap(_ gesture: UITapGestureRecognizer) {
guard let tappedView = gesture.view else { return }
let columnIndex = tappedView.tag
// Получаем индекс блока из внешнего контекста (например, через хранимое свойство ячейки, установленное в cellForRowAt)
let blockIndex = 0 // Пример: нужно получить реальный индекс блока
columnTappedHandler?(blockIndex, columnIndex)
}
// Метод для изменения цвета колонки извне
func setColumnColor(columnIndex: Int, color: UIColor) {
if columnIndex < stackView.arrangedSubviews.count {
stackView.arrangedSubviews[columnIndex].backgroundColor = color
}
}
}
// В методе tableView(_:cellForRowAt:)
// Устанавливаем columnTappedHandler и передаем текущий indexPath.section
// Внутри хэндлера вызываем tableView.cellForRow(at:) для получения нужной ячейки и setColumnColor на ней.