2014-09-18 13 views
6

ich Auto Layout verwenden,iOS8 unterschiedliches Verhalten: Automatische Anordnung mit view.transform = CGAffineTransformMakeScale (0,5, 0,5), Ansicht positioniert ist nicht richtig

ich einen kleineren UISwitch machen will und dann view.transform = CGAffineTransformMakeScale(0.5, 0.5) es zu erkennen, zu verwenden.

Es gibt eine andere Ansicht über diesem Schalter. dieser führend des Switch sollte diese Ansicht der Vorderkante ausgerichtet werden, und es gibt einen festen vertikalen Raum zwischen Ansicht und Schaltern, wie folgendem Bild:

enter image description here Ansichten auf iOS7

Es gibt jedoch unterschiedliches Aussehen auf iOS8:

enter image description here Ansichten auf iOS8

Scheinen, wie Einschränkungen auf diesen Schalter nicht angewandt werden.

Aber ich rief self.view.layoutSubviews() und self.view.layoutIfNeeded()

Es funktioniert nicht.

Wie wird dieser Schalter immer an die rechte untere Ecke der obigen Ansicht geklebt?

wird der Schalter Hier nicht verkleinert

enter image description here

+0

Auto-Layout nicht mit Schicht-Transformationen arbeiten –

+0

@MaxMacLeod Ich frage mich nur, warum der gleiche Code hat unterschiedliche Verhalten auf iOS7 und iOS8. Ich denke du meinst diese Antwort [link] (http://stackoverflow.com/questions/12943107/how-do-i-adjust-the-anchor-point-of-a-calayer-when-auto-layout-is- gebraucht/14105757 # 14105757), richtig? –

+0

Ich denke, es verhält sich so, weil die intrinsische Inhaltsgröße des UISwitch trotz der Änderung der Ansichtstransformation auf dem Standardformat w: 51px h: 31px bleibt. Sie sollten versuchen, den UISwitch abzuleiten und die Methode - (CGSize) intrinsicContentSize durch Zurückgeben von CGSizeMake (25.5f, 15.5f) zu überschreiben. –

Antwort

0

Sie haben zwei Möglichkeiten, hier zu gehen: entweder Unterklasse UISwitch und versuchen, alle notwendigen Änderungen in der Unterklasse anzuwenden, oder eine neue UIView zu definieren, welche umfasst als Unteransicht einen modifizierten UISwitch. Die Unterklasse ist vielleicht die schnellste, aber sie ist schwieriger und riskanter, da UISwitch keine Unterklassen für diese Art von Modifikation sein sollte.

Angenommen Sie die Subklassifizieren Weg zu gehen, hier sind die Änderungen, die Sie vornehmen müssen:

  1. die Skalierung auf self, offensichtlich Transformation anzuwenden.

  2. überschreiben alignmentRectForFrame:, so gibt es super.alignmentRectForFrame: plus Ihre Skalierung transform.

  3. Überschreibung intrinsicContentSize, so dass es super.intrinsicContentSize plus Ihre Skalierung zurück verwandeln

Grundsätzlich Nummer 1 die tatsächliche visuelle Transformation durchführen soll. Aber 2 und 3 sind notwendig, um Auto Layout über die Größe der neuen Ansicht zu informieren, da AL die Transformationen standardmäßig nicht kennt.

0

Die Transformation einer Ansicht findet um das Zentrum der Ansicht, so dass, wenn Sie rufen

view.transform = CGAffineTransformMakeScale(0.5, 0.5) 

Es macht Sinn, dass es so in iOS 8 sieht, ist der Grund, dass es in iOS 7 gut aussieht, ist wahrscheinlich wegen eines Fehlers in iOS 7.

Versuchen Sie, die Konstante der führenden Einschränkung wie folgt ändern:

self.switchLeadingConstraint.constant = -(self.mySwitch.bounds.size.width/4) 

diese Weise können Sie auf der Abseits kompensieren können, die Sie in iOS 8.