2017-06-03 3 views
1

Ort Programmatically Zeit auf Bildschirm, habe ich eine Pan-Geste, die durch kontinuierliches Verändern der Mitte eines Bildes mit so etwas wie dies eine UIImageView bewegt:Einschränkungen zurücksetzen

if let view = recognizer.view { 
    view.center = CGPoint(x:view.center.x + translation.x, 
          y:view.center.y + translation.y) 
} 

I Text möchte Etiketten in jeder Sekunde verändern auch (timer) und dies setzt das verschobene UIImageView aufgrund des automatischen Layoutformats auf Standardbedingungen zurück. Ich habe gesehen, dass die richtige Art, UIImageViews zu verschieben, darin besteht, die Einschränkungen der UIImageView und nicht die Mitte zu ändern. Gibt es eine Möglichkeit, die Einschränkungen eines UIImageView zu ändern, um die aktuelle Position des Bildes anzupassen? Ich versuchte mit

view.updateConstraints() 

aber das hat es nicht behoben. Idealerweise würde es sich wie die Option "Auf vorgeschlagene Einschränkungen zurücksetzen" verhalten, wenn Sie Einschränkungen manuell im Storyboard einrichten, aber stattdessen in der ViewController-Klasse verwenden. Ich versuche zu vermeiden, alle Einschränkungen als IBOutlets einzurichten und sie so zu bearbeiten, da ich viele Bilder mit mehreren Einschränkungen und mehreren Pan-Gesten habe, die geändert werden müssten.

+1

Sie tat versuch es mit view.setNeedsLayout() und view.layoutIfNeeded()? – Stefan

+0

@Stefan Ich habe versucht, nur diese beiden Methoden in den Pan-Geste-Selektor einzufügen, aber es hatte keine merkliche Auswirkung. Ich habe versucht, herauszufinden, was diese Methoden tun, aber ich bin Swift sehr neu, daher ist es möglich, dass es mehr gibt, diese Befehle zu verwenden, als sie nur in den Pan-Gesture-Selektor einzufügen. – esimran

Antwort

0

Ich glaube nicht, dass es eine Möglichkeit gibt, automatisch auf die vorgeschlagenen Einschränkungen zurückzusetzen. Sie können dies manuell tun, indem Sie die Konstanten in den Constraints aktualisieren.

Sie können Positionsbeschränkungen nicht als Konstante festlegen. Daher müssen Sie mit Einschränkungen relativ zu einem anderen Objekt beginnen und sie ändern. Stellen Sie beispielsweise die Mitte so ein, dass sie mit der Mitte der Superansicht übereinstimmt, und ändern Sie dann die Konstante, um sie an den aktuellen Status anzupassen.

Um dies zu tun, benötigen Sie Verweise auf die Einschränkungen. Sie können Ihren NSLayoutConstraints in Interface Builder erstellen und mit IBOutlets verknüpfen, oder Sie erstellen sie einfach programmgesteuert. Für letztere erklären sie als Instanz Eigenschaften Ihrer View-Controller und sie dann in seiner viewDidLoad() wie folgt erstellen:

horizontalConstraint = NSLayoutConstraint(item: x.view, attribute: .centerX, relatedBy: .equal, toItem: x.view.superview, attribute: .centerX, multiplier: 1, constant: 0) 
verticalConstraint = NSLayoutConstraint(item: x.view, attribute: .centerY, relatedBy: .equal, toItem: x.view.superview, attribute: .centerY, multiplier: 1, constant: 0) 
x.view.superview.addConstraints([horizontalConstraint, verticalConstraint]) 

Wenn Sie diese aktualisieren möchten, ändern Sie einfach die Konstante:

let superview = x.view.superview 
let currentOffsetX = x.view.center.x - superview.center.x 
let currentOffsetY = x.view.center.y - superview.center.y 

horizontalConstraint.constant = currentOffsetX 
verticalConstraint.constant = currentOffsetY 
+0

Ich habe versucht, diese Einschränkungen hinzuzufügen, aber ich erhalte einen Fehler, da er andere Einschränkungen beeinträchtigt, die bereits in der UIImageView festgelegt sind. Ich habe das gemieden, da die UIImageViews schon eine Menge von Einschränkungen haben, wie sie die Constraints für ihre Nachbarn vorgeben. Wäre es schlauer, einfach das automatische Layout zu entfernen und alle meine Einschränkungen programmgesteuert auszuführen, obwohl es für viele Bilder ein Problem ist? – esimran

+0

@esimran Ermitteln Sie, welche Constraints Konflikte verursachen, legen Sie IBOutlets so fest, dass Sie darauf zugreifen können, und ändern Sie stattdessen diese Constraints. Wenn sie keine ".centerX" - und ".centerY" -Einschränkungen sind, müssen Sie möglicherweise einige Berechnungen durchführen, um sie festzulegen. – Robert

+0

Als Test habe ich alle Einschränkungen für alle UIImageViews entfernt. Ich habe var verticalConstraint = NSLayoutConstraint() deklariert, die Einschränkungen verticalConstraint = NSLayoutConstraint (item: secondCard, Attribut: .centerY, relatedBy: .equal, toItem: nil, Attribut: .notAnAttribute, multiplikator: 1, constant: secondCard.center.y) hinzugefügt). secondCard ist das UIImageView. Ich aktualisierte Beschränkungen mit verticalConstraint.constant = view.center.y, aber der Fehler "Multiplikator von 0/null Sekunde Element zusammen mit einer Position für das erste Attribut erstellt eine ungültige Einschränkung eines Standorts gleich einer Konstante" – esimran