2016-09-26 22 views
11

iOSで使用するために、NSTokenField(Mailのアドレスピッカーなど)のように動作するコントロールを実装しています。私は水平のUICollectionViewを使用し、私の右端のセルはUITextFieldです。このコントロールは、右揃えのテキストを持つ他のテキストフィールドを含むフォームで表示されます。このコンテキストで私の新しいコントロールを正しく表示するには、UITextFieldが常にUICollectionViewの右端にあり、選択したタグがその左側に表示されるようにしたいと思います。水平方向に1つのセルをピン配置する

現在のところ、この行を最初にクリックすると、テキストフィールドが左にスクロールし、さらにタグが追加されると右にプッシュされます。 UICollectionViewの右端と一度一致すると(下の画像に「Appetizer」が追加されている場合)、私は必要な動作を開始します。

​​

私はタグが追加される最初と少なくで利用可能であるように、それは同じくらいの幅を占めUITextFieldに最小幅のような何かについて考えてきました。あるいは、固定されたフィールドを右に固定する何らかの方法です。私はこれらのアイデアを実装する方法を見つけていない!

テキストフィールドが常にUICollectionViewの右側になるようにするにはどうすればよいですか?

答えて

0

UICollectionViewDataSource

の一部として使用してみてください

// -dequeueReusableSupplementaryViewOfKindの呼び出しから取得する必要があります返されるビュー:withReuseIdentifier:forIndexPath: - (UICollectionReusableView *)collectionView:(UICollectionView * )コレクションビューviewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath;

テキストフィールドをフッターとして含むビューを定義します。

5

ここには、UITextFieldがUICollectionViewの一部ではないソリューションがあります。

enter image description here

私は、次のようなレイアウトの制約に私のストーリーボード上collectionViewとTextFieldを追加しました: CollectionViewを:、テキストフィールドでの水平方向の間隔をスーパーするスーパー、身長、トップにリードします。 TextField:collectionViewに等しい高さ、スーパービューに後続、width = 100、collectionViewでの水平間隔。

私はtextFieldの幅制約のためにIBOutletを作成しました。テキストが入力されると、幅が動的に変更されます。

スウィフト3サンプルコード

class ViewController: UIViewController { 

    @IBOutlet weak var collectionView: UICollectionView! 
    @IBOutlet weak var textField: UITextField! 
    @IBOutlet weak var textFieldWidthConstraint: NSLayoutConstraint! 

    var textArray: [String] = [String]() 

    @IBAction func editingChanged(_ sender: AnyObject) { 
     let size = textField.sizeThatFits(textField.frame.size) 
     textFieldWidthConstraint.constant = max(size.width,100) 

     if textArray.count > 0 { 
      self.collectionView.scrollToItem(at: IndexPath(row: self.textArray.count-1, section: 0), at: .right, animated: true) 
     } 
    } 

    @IBAction func addText(_ sender: AnyObject) { 
     if textField.text?.characters.count ?? 0 > 0 { 
      textArray.append(textField.text!) 
      textField.text = "" 
      textFieldWidthConstraint.constant = 100 
      let newIndexPath = IndexPath(row: textArray.count-1, section: 0) 
      collectionView.insertItems(at: [newIndexPath]) 
      collectionView.performBatchUpdates({ 
       }, completion: { (_) in 
        self.collectionView.scrollToItem(at: newIndexPath, at: .right, animated: true) 
      }) 
     } 
    } 

} 
+0

私も同じことを考えていた...この答えは素敵な回避策があります。それはあなたが必要とするものの効果を与えるでしょう。 @エレンマーティン –

+0

ありがとうございました。@ carien-van-zyl。これから数日で私はこれを使って遊びます。私は賞金の満期を謝罪します - 私は数日間離れていました! –

関連する問題