2016-09-26 28 views
11

iOS'ta kullanmak üzere bir NSTokenField (örneğin, adres seçicisi) gibi davranan bir denetim gerçekleştiriyorum. Yatay bir UICollectionView kullanıyorum ve en sağdaki hücrem UITextField. Bu denetim, sağa hizalı metin içeren diğer metin alanları ile birlikte görünecektir. Yeni denetimimin bu bağlamda doğru görünmesi için, UITextField'un her zaman UICollectionView'un sağ kenarında olmasını ve seçili etiketlerin solunda görünmesini istiyorum.Sağdaki UICollectionView öğesinde bir hücreyi sağa doğru sabitleyin

Şu anda bu satıra ilk tıkladığımda, metin alanı sola doğru kayar ve daha fazla etiket eklendiğinde sağa itilir. UICollectionView'un sağ kenarı ile aynı hizaya geldiğinde (aşağıdaki görüntüde 'Appetizer' eklendiğinde), istediğim davranışı almaya başladım.

Tag selection

Ben UITextField minimum genişliği gibi bir şey düşünüyordum böylece birinci ve az ve etiketleri eklendikçe daha az mevcuttur kadar genişliğe kadar sürer. Veya dönüşümlü olarak sabit alan alanını sağa doğru sabitlemenin bir yolu. Yine de bu fikirleri uygulamaya koymanın bir yolunu bulamadım!

Metin alanının her zaman UICollectionView'un sağında olmasını nasıl sağlayabilirim?

cevap

0

UICollectionViewDataSource

parçası olarak kullanmayı deneyin

// -dequeueReusableSupplementaryViewOfKind bir çağrı alınması gerekir döndürülür görünüm: withReuseIdentifier: forIndexPath: - (UICollectionReusableView *) CollectionView'ın: (UICollectionView *) collectionView viewForSupplementaryElementOfKind: (NSString *) tür atIndexPath: (NSIndexPath *) indexPath;

Ve metin alanını altbilgi olarak içeren görünümünüzü tanımlayın.

5

UITextField'ın UICollectionView'un bir parçası olmadığı bir çözüm. CollectionView: Superview Yol Açan, Yükseklik, Top Superview için, TextField ile yatay aralık

enter image description here

aşağıdaki düzen kısıtlamaları ile benim film şeridinde CollectionView'ın ve textfield'ı ekledi. TextField: CollectionView ile yüksekliğe eşittir, superview için izler, Genişlik = 100, horizontal ile boşluk.

textField öğesinin genişlik kısıtlaması için bir IBOutlet oluşturdum. Metin girildiğinde genişlik dinamik olarak değiştirilir.

Swift 3 Örnek Kod

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

Ben de aynı düşünüyordum ... Bu cevap güzel çözümdür. İhtiyacınız olan şeyin etkisini verecektir. @ Hélène Martin –

+0

Çok teşekkürler @ carien-van-zyl. Önümüzdeki birkaç gün içinde bununla oynayacağım. Ödemenin sona ermesi için özür dilerim - birkaç günlüğüne uzaktayım! –