2017-01-04 3 views
1

.Повторите ярлык в TableViewCell

Mock up Мне нужно решение для работы в iOS 8. Stack View не помогает в iOS 8

Мне прислан этот макет ... Я точно не знаю, как повторить конкретную метку в таблицеViewCell. Как вы можете видеть, мне нужно повторить фиолетовый ярлык и белые ярлыки в зависимости от предметов в данных JSON.

+1

Вы можете иметь любое количество такого рода этикетки , или просто 0, 1 или 2? Если да, просто подготовьте тезисы и спрячьте их, если необходимо. – Larme

+0

@ Larme вы можете уточнить .. о чем вы говорите, когда вы упоминаете 0,1,2 – SaiPavanParanam

+0

Фиолетовая метка, если вы можете получить ее только один или два раза (но не 32 раза, например, в одной и той же ячейке), это Полегче. Но во-первых, можете ли вы самостоятельно настроить свой 'UITableViewCell'? – Larme

ответ

1

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

enter image description here

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

  • Вам не нужно возиться с скрытым свойством переключений просмотров
  • Вы не ограничены фиксированным максимальным числом бер элементов

Вот код:

import UIKit 

class Order { 
    var stations = [Station]() 
    var companies = [String]() 
} 
class Station { 
    let name: String 
    let amount: Int 
    init(name: String, amount: Int) { 
     self.name = name 
     self.amount = amount 
    } 
} 

class TableViewController: UITableViewController { 

    var orders = [Order]() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView!.rowHeight = UITableViewAutomaticDimension 
    tableView!.estimatedRowHeight = 44.0 

    //simulated data 
    let order1 = Order() 
    order1.companies.append("Global @ CITGO Braintree, Braintree") 
    order1.companies.append("Exxon @ Global, Chelsea") 
    order1.stations.append(Station(name: "Tyngsboro Mobil #2871", amount: 4000)) 
    order1.stations.append(Station(name: "Grafton St #10095", amount: 15000)) 
    orders.append(order1) 

    let order2 = Order() 
    order2.companies.append("Exxon @ Global, Chelsea") 
    order2.stations.append(Station(name: "Winstead Citgo #2001", amount: 3000)) 
    orders.append(order2) 

    let order3 = Order() 
    order3.companies.append("MSCG @ Sunoco Partners") 
    order3.stations.append(Station(name: "Citgo #123", amount: 7000)) 
    order3.stations.append(Station(name: "Mobil #345", amount: 12500)) 
    order3.stations.append(Station(name: "Exxon #567", amount: 300)) 
    order3.stations.append(Station(name: "Citgo #789", amount: 6100)) 
    order3.stations.append(Station(name: "Stoughton Mobil #2744", amount: 9098)) 
    order3.stations.append(Station(name: "Westborough Mobil #2720", amount: 120000)) 
    orders.append(order3) 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return orders.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as! TableViewCell 

    let order = orders[indexPath.row] 

    cell.companyLabel.text = "" 
    for (index, company) in order.companies.enumerated() { 
     cell.companyLabel.text! += company 
     if index < order.companies.count - 1 { 
      cell.companyLabel.text! += "\n" 
     } 
    } 

    for station in order.stations { 

     // create horizontal stack view to arrange the station name and amount 
     let horizontalStackView = UIStackView() 
     horizontalStackView.axis = .horizontal 

     let nameLabel = UILabel() 
     nameLabel.translatesAutoresizingMaskIntoConstraints = false 
     nameLabel.text = station.name 
     horizontalStackView.addArrangedSubview(nameLabel) 

     let amountLabel = UILabel() 
     amountLabel.translatesAutoresizingMaskIntoConstraints = false 
     amountLabel.addConstraint(NSLayoutConstraint(item: amountLabel, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1.0, constant: 60)) 
     amountLabel.backgroundColor = UIColor.purple 
     amountLabel.textAlignment = .right 
     amountLabel.textColor = UIColor.white 
     amountLabel.text = String(station.amount) 
     horizontalStackView.addArrangedSubview(amountLabel) 

     // add the horizontal stack view to the vertical stack view containing all stations 
     cell.stackView.addArrangedSubview(horizontalStackView) 
    } 

    return cell 
} 

}

Вот что раскадровка выглядит следующим образом:

enter image description here

+0

Но не будет ли ваш код выходить из строя, если имя сайта больше двух строк ... будет ли число правильно выравниваться снова? – SaiPavanParanam

+0

А также из вашего ответа нет пробелов между фиолетовыми ярлыками ... – SaiPavanParanam

+0

Попробуйте скопировать код в образец проекта. Я сделал так, чтобы вы могли легко изменить данные образца и посмотреть, что произойдет. Вы можете использовать свойство интервала UIStackView, чтобы добавить пространство между фиолетовыми ярлыками. Очевидно, вам придется самостоятельно выполнять некоторые работы, чтобы получить стиль точно так же, как макет, но я показал вам, как повторять метки внутри ячейки. Удачи! –

0

В storyboard у вас должно быть два UILabel для белого и фиолетового. Если Json есть данные, то присвоить ему в противном случае сделать ниже код

cell.label1.frame.size.height = 0 
cell.label2.frame.size.height = 0 

Примечание: Becarefull об ограничениях вы придающих компонентов в UITableViewCell.

+0

Я не могу понять ваш ответ – SaiPavanParanam

+0

Это вызовет много проблем с компоновкой ваших ячеек, поэтому я бы не рекомендовал этот метод. –

+1

Я делаю это с многих месяцев, у меня никогда не было никаких проблем, даже для меня это самое прекрасное. @BenjaminLowry Если у вас есть какой-либо другой метод, рад слышать. –

2

Это идеальный сценарий для пользователя UIStackView, добавьте 5 меток внутри Stack View и скрыть (.isHidden недвижимости) этикетки, которые вы не хотите, чтобы показать, это приведет к Stack View к термоусадочную и Разверните на основе количества имеющихся в нем ярлыков.

Надеюсь, вам уже сообщили, что Stack View, если нет, то вы должны искать базовый онлайн-учебник.

+1

. Я проверю это вне – SaiPavanParanam

+0

, как это сделать в iOS 8.0, так как просмотр стека недоступен менее чем в 9 версиях iOS – SaiPavanParanam

+0

Это не работает в iOS 8, вы уже реализовали? –

0

Согласно @the_dahiya_boy ответ:

  1. Вы получаете поле JSON с конкретными полями (может быть один или два поля, которые должны отображаться в фиолетовых полях)

  2. Вы проверить сколько полей есть

  3. Если есть только одно поле, вы можете взять рамку вашего второго вида (для второго поля, которое пусто) как 0
1

Как упоминал г-н Биста, есть опция с StackView.

  1. Создать пользовательскую ячейку в ракурсе с дизайном.
  2. Вместо добавления нескольких меток используйте представление стека.
  3. В коде используются ячейки для самостоятельной калибровки. Вы можете обратиться к этому сайту, чтобы вести вас. APPCode self sizing cells или просто найдите stackoverflow.

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

  1. Изменение содержимого представления стека на основе содержимого json. (Количество записей для фиолетовых меток)

Вы также можете проверить стек на аналогичные вопросы. Пожалуйста, просмотрите эту ссылку, где есть возможный ответ для вас. Multiple UILabels inside a self sizing UITableViewCell

+0

, как это сделать в iOS 8.0, так как представление стека недоступно менее чем в 9 версиях iOS – SaiPavanParanam

+0

Итак, если вы используете

Смежные вопросы