2017-08-25 4 views
1

Ich entwickle eine iOS-Anwendung, mit der Benutzer Formulare erstellen können. Das Formular enthält eine Anzahl von UIView-Elementen, die in UIScrollView im Stapel gespeichert sind. Was die Bearbeitung angeht, sollen UIViews die Aufträge ändern.Wie ziehe ich UIView-Elemente und ändere die Position?

Wie erreiche ich das? Ich möchte jede UIView-Komponente ziehen und sie überall im Formular verschieben. Für z. Das dritte Element wird sich selbst aktivieren, um sich zu bewegen. Wenn Sie das zweite Element verschieben, wird seine Position ersetzt. Ich verwende die Schwenkgeste, um UIViews zu verschieben. Wie kann ich nun wissen, ob die Tapped-Ansicht auf einer UIView erreicht wurde?

+0

https://github.com/bvogelzang/BVReorderTableView zum Neuordnen der Zelle UITableView –

Antwort

0

Soweit ich Ihre Anforderung verstehe, soll der Benutzer in der Lage sein, einige UIViews wie Drag-Drop in der übergeordneten Ansicht zu verschieben/neu zu positionieren.

Ich würde vorschlagen, Sie verwenden collectionView mit seiner interaktiven Bewegung aktiviert. Wenn Sie einige Bibliothek verwenden möchten, dann können Sie versuchen https://github.com/ra1028/RAReorderableLayout

Oder UIView Drag & Drop Implementierung können Sie überprüfen diese https://blog.apoorvmote.com/uipangesturerecognizer-to-make-draggable-uiview-in-ios-swift/

+0

Dies ist ein Kommentar sein sollte, keine Antwort. – iPeter

+0

Ich kann CollectionView jetzt nicht verwenden, da ich bereits viel Code für die Bearbeitung von Formularen geschrieben habe. Ich muss jetzt nur UIView neu anordnen, die in UIScrollView hinzugefügt werden. –

+0

@iPeter Korrekt !! Aber haben Sie nicht das Privileg, einen Kommentar hinzuzufügen :) – Apogee

0

Es gibt nur wenige einfache Möglichkeiten für UICollectionViewController, die leicht von canMoveItemAt Delegatmethode gehandhabt werden kann wenn Sie einen view-Controller haben Sie folgende Art und Weise versuchen:

import UIKit 

class LoveProfileEditViewViewController: BaseViewController { 
    fileprivate var longPressGesture:UILongPressGestureRecognizer! 
    @IBOutlet var theCollectionView:UICollectionView! 
    public var items:[String]! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let horizontalLayout = UICollectionViewFlowLayout() 
     horizontalLayout.scrollDirection = .horizontal 
     self.theCollectionView.collectionViewLayout = horizontalLayout 
     self.theCollectionView.register(UINib(nibName: "SomeNibName", bundle: nil), forCellWithReuseIdentifier: "Some Identifier") 
     self.longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.handleLongGesture(gesture:))) 
     self.theCollectionView.addGestureRecognizer(longPressGesture) 
    } 

    fileprivate func moveDataItem(_ sIndex: Int, _ dIndex: Int) { 
     let item = self.items.remove(at: sIndex) 
     self.items.insert(item, at:dIndex) 
     self.theCollectionView.reloadData() 
    } 

    @objc private func handleLongGesture(gesture: UILongPressGestureRecognizer) { 
     switch(gesture.state) { 
     case UIGestureRecognizerState.began: 
      guard let selectedIndexPath = self.theCollectionView.indexPathForItem(at: gesture.location(in: self.theCollectionView)) else { 
       break 
      } 
      self.theCollectionView.beginInteractiveMovementForItem(at: selectedIndexPath) 

     case UIGestureRecognizerState.changed: 
      guard let selectedIndexPath = self.theCollectionView.indexPathForItem(at: gesture.location(in: self.theCollectionView)) else { 
       break 
      } 
      self.theCollectionView?.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!)) 

     case UIGestureRecognizerState.ended: 
      self.theCollectionView.endInteractiveMovement() 
     default: 
      self.theCollectionView.cancelInteractiveMovement() 
     } 
    } 

} 

// MARK: - UICollectionViewDelegateFlowLayout 
extension LoveProfileEditViewViewController: UICollectionViewDelegateFlowLayout { 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     return CGSize(width: 88.0, height: collectionView.bounds.size.height) 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
     return UIEdgeInsetsMake(0.0, 5.0, 0.0, 5.0) 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
     return 10.0 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
     return 10.0 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { 
     return .zero 
    } 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { 
     return .zero 
    } 
} 

// MARK: - UICollectionViewDataSource 
extension LoveProfileEditViewViewController: UICollectionViewDataSource { 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return self.items.count 
    } 

    func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool { 
     //set boolean as per your need 
     return true 
    } 

    func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { 
     if sourceIndexPath.row > 0 && destinationIndexPath.row > 0 { 
      self.moveDataItem(sourceIndexPath.row, destinationIndexPath.row) 
     } 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Some Identifier", for: indexPath) as! SomeNibName 
     cell.textLabel.text = self.items[indexPath.row] 
     return cell 
    } 
} 
+0

Ich denke, ich erwähnte objective-c –

+0

Ich benutze Pan-Geste, um UIViews zu verschieben. Wie kann ich nun wissen, ob die Tapped-Ansicht auf einer UIView erreicht wurde? –

+0

Sie müssen nicht viel über diesen Fall nachdenken, wenn Sie nur eine Nachbestellung brauchen. Und Entschuldigung für schnell, da ich mehr in schnelle bin als objektive-c :) –

0
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button addTarget:self action:@selector(imageTouch:withEvent:) 
forControlEvents:UIControlEventTouchDown]; 
[button addTarget:self action:@selector(imageMoved:withEvent:) 
forControlEvents:UIControlEventTouchDragInside]; 
[button setImage:[UIImage imageNamed:@"vehicle.png"] 
forState:UIControlStateNormal]; 
[self.view addSubview:button]; 

Dann können Sie das Fahrzeug bewegen, wo immer Sie wollen, indem Sie auf das UIControlEventTouchDragInside Ereignis reagieren, zum Beispiel:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event 
{ 
CGPoint point = [[[event allTouches] anyObject] locationInView:self.view]; 
UIControl *control = sender; 
control.center = point; 
} 
+0

Ich habe es mit UILongTapGestureRecognizer getan. –

Verwandte Themen