2016-09-26 2 views
11

iOS에서 사용하기 위해 NSTokenField (Mail의 주소 선택기)처럼 동작하는 컨트롤을 구현하고 있습니다. 나는 가로 UICollectionView을 사용하고 가장 오른쪽의 셀은 UITextField입니다. 이 컨트롤은 오른쪽 맞춤 텍스트가있는 다른 텍스트 필드가있는 양식으로 나타납니다. 이 컨텍스트에서 새로운 컨트롤을 보려면 UITextField이 항상 UICollectionView의 오른쪽 가장자리에 있고 선택한 태그가 왼쪽에 나타나야합니다.가로로 1 셀 고정 UICollectionView 오른쪽에

현재이 행을 처음 클릭하면 텍스트 필드가 왼쪽으로 스크롤 된 다음 더 많은 태그가 추가 될 때 오른쪽으로 밀려납니다. UICollectionView ('Appetizer'가 아래 이미지에 추가 될 때)의 오른쪽 가장자리와 일치하면 원하는 동작을 시작합니다.

Tag selection

나는 UITextField에 최소 폭 뭔가에 대해 생각을 해 봤는데 그렇게 먼저 적은 및 태그가 추가로 더 적은에서 확인할 수만큼의 폭을 차지합니다. 또는 고정식 필드를 오른쪽에 고정하는 방법도 있습니다. 그래도이 아이디어를 구현할 방법을 찾지 못했습니다!

텍스트 필드가 항상 UICollectionView의 오른쪽에 있도록하려면 어떻게해야합니까?

답변

0

UICollectionViewDataSource

의 일환으로 사용해보십시오

// -dequeueReusableSupplementaryViewOfKind의 호출에서 검색해야 반환되는보기 : withReuseIdentifier : forIndexPath : - (UICollectionReusableView *) collectionView : (UICollectionView *) 컬렉션 viewForSupplementaryElementOfKind : (NSString *) 종류 atIndexPath : (NSIndexPath *) indexPath;

텍스트 필드를 바닥 글로 포함하는보기를 정의하십시오.

5

여기에 UITextField가 UICollectionView의 일부가 아닌 솔루션이 있습니다. 이 CollectionView : 수퍼에 선도, 높이, 최고 수퍼하려면, 텍스트 필드의 수평 간격

enter image description here

나는 다음과 같은 레이아웃 제약 내 스토리 보드에 collectionView 및 TextField를 추가했다. TextField : collectionView와 동일한 높이, 수퍼 뷰로 후행, 너비 = 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. 앞으로 며칠 이내에이 문제를 해결해 나갈 것입니다. 현상금 만료에 대해 사과드립니다. 나는 며칠 동안 떨어져있었습니다! –