ios - 数组计数(数组内)以确定 UIView 宽度

标签 ios arrays swift multidimensional-array uiview

我试图弄清楚如何获取数组中数组的计数(不知道技术术语)。

我正在创建 UIView 组,我希望这些组的宽度能够根据组内 UIView 的数量动态更改。

我知道如何执行此操作的唯一方法(可能)是查找 blockTitles (组)的计数,但我在从 palletViewConstraint( ) 中提取此计数时遇到问题) 函数。

寻求有关此解决方案的帮助或更好解决方案的建议。

干杯!

func mainViews(inputView: UIView){

    <...>

    //POPULATING PALLET WITH BLOCKS
    let blockTitles1 = ["1", "2", "3", "4", "5"]
    let blockTitles2 = ["6", "7", "8", "9", "10"]
    let blockTitles3 = ["11", "12", "13", "14", "15"]
    let blockTitles4 = ["16", "17", "18", "19", "20"]
    let blockTitles5 = ["21", "22", "23", "24", "25"]

    var group1 = createBlockGroup(blockTitles1)
    var group2 = createBlockGroup(blockTitles2)
    var group3 = createBlockGroup(blockTitles3)
    var group4 = createBlockGroup(blockTitles4)
    var group5 = createBlockGroup(blockTitles5)

    palletView.addSubview(group1)
    palletView.addSubview(group2)
    palletView.addSubview(group3)
    palletView.addSubview(group4)
    palletView.addSubview(group5)

    palletViewConstraint(palletView, groups: [group1, group2, group3, group4, group5], blockTitles: [blockTitles1, blockTitles2, blockTitles3, blockTitles4, blockTitles5])

}

func createBlock(title: String) -> UIView{

    let block = UIView()
    block.backgroundColor = UIColor.lightGrayColor()
    block.translatesAutoresizingMaskIntoConstraints = false

    let blockLabel = UILabel()
    blockLabel.frame = CGRectMake(0, 0, 100, 100)
    blockLabel.text = title
    blockLabel.textColor = UIColor.darkGrayColor()
    blockLabel.textAlignment = NSTextAlignment.Center

    block.addSubview(blockLabel)

    return block
}

func createBlockGroup(blockTitles: [String]) -> UIView {

    var blocks = [UIView]()
    let blockGroups = UIView()
    blockGroups.frame = CGRectMake(0, 0, 100, 100)
    blockGroups.backgroundColor = UIColor.redColor()

    for blockTitle in blockTitles{
        let block = createBlock(blockTitle)
        blocks.append(block)
        blockGroups.addSubview(block)
    }

    blockConstraint(blocks, mainView: blockGroups)

    return blockGroups

}

func blockConstraint(blocks: [UIView], mainView: UIView){

    <...>

}

func palletViewConstraint(inputView: UIView, groups: [UIView], blockTitles: [[String]]){

    print(blockTitles.count)

}

func mainViewConstraints(inputView: UIView, pallet: UIScrollView, canvas: UIView){

    <...>
}



}

最佳答案

您可以使用以下方式访问数组中数组的计数

mainArr[0].count

这将获取 mainArr 中第一个数组的计数。

我建议子类化 UIView并使用方便的初始值设定项将框架设置为除以 View 数量的值(可以通过委托(delegate)模式访问)。

这是 UIView 的示例我设置用于动态调整 subview 网格的子类。整个项目可以在我的github页面上找到:https://github.com/cmako10/UI-View-Groups

这是子类:

class GroupView: UIView {

  var rows: Int!
  var columns: Int!
  var size: CGSize!
  var origin: CGPoint!

  enum TypeToAdd: String {
    case row = "Row"
    case column = "Column"
  }

  enum AlterAction: String {
    case add = "Add"
    case delete = "Delete"
  }

  convenience init(origin: CGPoint, size: CGSize, columns: Int, rows: Int) {
    self.init(frame: CGRect(origin: origin, size: size))
    self.size = size
    self.origin = origin
    self.rows = rows
    self.columns = columns
  }

  override func drawRect(rect: CGRect) {
    frame.size.width = size.width
    frame.size.height = size.height
    super.drawRect(rect)
    for view in self.subviews {
      view.removeFromSuperview()
    }
    let width = size.width / CGFloat(columns)
    let height = size.height / CGFloat(rows)
    let subviewSize = CGSize(width: width, height: height)
    for y in 0..<rows {
      for x in 0..<columns {
        let newView = UIView(frame: CGRect(origin: CGPoint(x: (CGFloat(x) * width), y: (CGFloat(y) * height)), size: subviewSize))

        let label = UILabel(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: subviewSize))
        label.adjustsFontSizeToFitWidth = true
        label.textAlignment = .Center
        label.font = UIFont.systemFontOfSize(15, weight: 10.0)
        label.textColor = UIColor.blackColor()
        label.center = CGPoint(x: newView.frame.midX, y: newView.frame.midY)
        label.text = "[\(x), \(y)]"
        newView.addSubview(label)

        if y % 2 == 0 {
          if x % 2 == 0 {
            newView.backgroundColor = UIColor.lightGrayColor()
          } else {
            newView.backgroundColor = UIColor.blueColor()
          }
        } else {
          if x % 2 == 0 {
            newView.backgroundColor = UIColor.blueColor()
          } else {
            newView.backgroundColor = UIColor.lightGrayColor()
          }
        }
        addSubview(newView)
      }
    }
  }

  func alter(type: TypeToAdd, action: AlterAction){
    switch type {
    case .column:
      switch action {
      case .add:
        columns = columns + 1
      case .delete:
        columns = columns - 1
      }
    case .row:
      switch action {
      case .add:
        rows = rows + 1
      case .delete:
        rows = rows - 1
      }
    }
    setNeedsDisplay()
  }
}

您应该下载并检查 Xcode 项目。动态更新的总体思路UIView就是删除所有 subview ,然后重新添加drawRect中的 subview 然后调用setNeedDisplay每当您需要更新 GroupView 的内容时.

编辑:

访问blockTitles的子数组的计数我看到两种可能的解决方案。

  1. 使用for循环,在循环开始处定义一个常量,使其等于“i”处子数组的计数,然后将代码放入 palletViewConstraint 中之后并引用 count根据需要保持恒定。
  2. 定义一个变量来保存 Int 开头的计数值(palletViewConstraint 的数组)使用高级函数map要将所有 blockTitle 计数附加到先前定义的变量,请使用 for 循环和定义的计数数组来运行 palletViewConstraint 的其余部分。 .

示例:

示例 1:

func palletViewConstraint(inputView: UIView, groups: [UIView], blockTitles: [[String]]){
   //Do this so the count is not recalculated each for loop
   let blockTitlesCount = blockTitles.count
   for i in blockTitlesCount {
      let subArrCount = blockTitles[i].count
      //The rest of your palletViewConstraint Code that references subArrCount

   }
 }

示例2:

func palletViewConstraint(inputView: UIView, groups: [UIView], blockTitles: [[String]]){
   var countArr = [Int]()

   arr.map { (subArr) in
      countArr.append(subArr.count)
   }

   for count in countArr {
      //Your code referencing the count of each subArr

   }
}

如果您需要详细说明,请询问!

关于ios - 数组计数(数组内)以确定 UIView 宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928882/

相关文章:

iOS 在同一请求中发送 POST 和 GET

ios - iOS 7 UITableViewCell 中与 AutoLayout 冲突的约束

iOS swift : Animating TableviewCell changes do not work correctly

ios - 架构 armv7 的 undefined symbol 。 xcode 10.ionic ios 项目

swift - textLabel?.text 仅显示 "Label",但不显示从先前 TableView 传递的实际数据

ios - 如何在允许设置 Root View Controller 的同时调整 UINavigationBar 的高度?

ios - 没有越狱检测

python - 在python中动态创建变量

c - array[1][2] 和 array[1,2] 有什么区别?

java - 我的返回值始终等于 0