2015-10-24 14 views
6

Ich habe diese Methode versuchtZiehen Bilder auf dem Bildschirm mit schnellen

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) { 

let translation = recognizer.translationInView(self.view) 
if let view = recognizer.view { 
    view.center = CGPoint(x:view.center.x + translation.x, 
         y:view.center.y + translation.y) 
} 
recognizer.setTranslation(CGPointZero, inView: self.view) 
} 

Es funktioniert, aber das Problem ist, dass, wenn ich diese Methode auf mehrere Bilder verwenden es einige Probleme zum Beispiel erstellen, wenn Drag ein Bild und ändere seine Position, aber wenn ich auf das zweite Bild klicke und ziehe. Mein erstes Bild kommt zurück zur ursprünglichen Position. Hier sind die Bilder, die ich von einer Rolle Ansicht bin immer: Wenn ich erste Bild zweiten Bild klicken auch die ursprüngliche Position

enter image description here gehen

Ich Wenn Sie ein Bild seiner feinen hier

enter image description here

Antwort

6

Auto-Layout wird ausgeführt, um Ihre Bilder dorthin zu verschieben, wo die Einschränkungen angeben.

Der einfachste Weg, dies zu umgehen, ist, Ihre Bilder in Code zu erstellen, anstatt sie im Storyboard zu erstellen.

Etwas wie:

let lightBulb = UIImageView(frame: CGRectMake(100, 100, 50, 50)) 
lightBulb.image = UIImage(named: "lightBulb") 
lightBulb.contentMode = .ScaleToFill 
lightBulb.userInteractionEnabled = true 

lightBulb.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: "handlePan:")) 

self.view.addSubview(lightBulb) 
+0

habe ich versucht, dies aber nichts auf dem Bildschirm zeigt bis ich diesen Code –

+0

auf der Rückseite einer Button-Aktion geschrieben habe ich das gerade versucht, und es funktioniert. Vielleicht sollten Sie ein '@ IBOutlet' in der Inhaltsansicht der Bildlaufansicht erstellen, um das Hinzufügen von Elementen zu erleichtern. '@IButlet schwaches var contentView: UIView!' Und hakt das mit der Inhaltsansicht deiner Bildlaufansicht. Dann füge das lightBulb wie folgt hinzu: 'contentView.addSubview (lightBulb)'. – vacawama

+0

ich bekomme das "UIScrollView hat kein Mitglied mit dem Namen contentView" und ich möchte die Bilder aus der Bildlaufansicht auswählen und dann zur Hauptansicht anzeigen –

6
class DraggableImageView: UIImageView { 


var dragStartPositionRelativeToCenter : CGPoint? 

override init(image: UIImage!) { 
    super.init(image: image) 

    self.userInteractionEnabled = true //< w00000t!!!1 

    addGestureRecognizer(UIPanGestureRecognizer(target: self, action: "handlePan:")) 

    layer.shadowColor = UIColor.blackColor().CGColor 
    layer.shadowOffset = CGSize(width: 0, height: 3) 
    layer.shadowOpacity = 0.5 
    layer.shadowRadius = 2 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func handlePan(nizer: UIPanGestureRecognizer!) { 
    if nizer.state == UIGestureRecognizerState.Began { 
     let locationInView = nizer.locationInView(superview) 
     dragStartPositionRelativeToCenter = CGPoint(x: locationInView.x - center.x, y: locationInView.y - center.y) 

     layer.shadowOffset = CGSize(width: 0, height: 20) 
     layer.shadowOpacity = 0.3 
     layer.shadowRadius = 6 

     return 
    } 

    if nizer.state == UIGestureRecognizerState.Ended { 
     dragStartPositionRelativeToCenter = nil 

     layer.shadowOffset = CGSize(width: 0, height: 3) 
     layer.shadowOpacity = 0.5 
     layer.shadowRadius = 2 

     return 
    } 

    let locationInView = nizer.locationInView(superview) 

    UIView.animateWithDuration(0.1) { 
     self.center = CGPoint(x: locationInView.x - self.dragStartPositionRelativeToCenter!.x, 
      y: locationInView.y - self.dragStartPositionRelativeToCenter!.y) 
    } 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
override func drawRect(rect: CGRect) { 
// Drawing code 
} 
*/ 
} 
+0

es funktioniert für mich – Dhiraj

+1

Wie kann ich diese Klasse verwenden? – n4zg

Verwandte Themen