2016-06-20 8 views
0

配列内の配列の数を取得する方法を理解しようとしています(技術用語が分かりません)。配列の配列(配列内の)の数を決定する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){ 

    <...> 
} 



} 
+0

私はあなたを手伝っていますが、達成しようとしているものの写真を投稿できますか(これはこのコードだけで曖昧です)。 – Ike10

答えて

0

あなたはmainArrにおける最初の配列の数を取得します

mainArr[0].count 

これを使用することにより、アレイ内のアレイの数にアクセスすることができます。

UIViewをサブクラス化し、便利な初期化子を使用してフレームをビュー数(デリゲートパターンでアクセス可能)で割った値に設定することをお勧めします。

サブビューのグリッドを動的に調整するように設定したUIViewサブクラスの例を次に示します。プロジェクト全体は、私の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を動的に更新する一般的な考え方は、すべてのサブビューを削除し、サブビューをdrawRectに再追加し、GroupViewの内容を更新する必要があるときはいつでもsetNeedDisplayに電話することです。

編集:

私は2つの解決策を参照してくださいblockTitlesのサブアレイのカウントにアクセスします。

  1. は、forループを使用するのサブアレーの数に等しくなるように、ループの先頭に定数を定義する「i」は、その後palletViewConstraint内のコードを入れて、count必要に応じて定数として参照します。
  2. palletViewConstraintの先頭にあるカウント値(配列Int)を保持する変数を定義すると、高レベル関数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 

    } 
} 

あなたが精緻化が必要な場合はお問い合わせください!

+0

@Geppelt私が何を意味していたかの例については、私の編集を参照してください。 – Ike10

+0

フィードバックいただきありがとうございます。しかし、問題は、私があなたのフィードバックを実装するために多くを再構成しなければならないということです。私は単純に、私のblockTitlesの文字列数をグループの制約Iに設定する解決策を見つけようとしています。配列は次のようになります: 'group [blockTitle1 [" 1 "、" 2 "、" 3 "、" 4 "、" 5 "]、blockTitle2 [" 1 "、" 2 "、" 3 "、" 4 "、" 5 "] ...]'私はgroup.countを得ることができますが、私が本当に望んでいるのはgroup [index] .countです。このカウントは、サブビューとして追加されるときに各グループの幅を定義するために複数になります。理にかなっている? – Geppelt

+0

グループ[index] .countにはどこにアクセスできますか?なぜあなたができないのか分かりません。あなたはそのエリアのコードを投稿することができますので、私は助けることができますか? @Geppelt – Ike10