我试图弄清楚如何获取数组中数组的计数(不知道技术术语)。
我正在创建 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
的子数组的计数我看到两种可能的解决方案。
- 使用for循环,在循环开始处定义一个常量,使其等于“i”处子数组的计数,然后将代码放入
palletViewConstraint
中之后并引用count
根据需要保持恒定。 - 定义一个变量来保存
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/