2017-08-03 3 views
1

Ich habe Label und ich gab Werte der XY-Achse, aber meine Werte nicht Label auf der Mitte pro Gerät, und ich schrieb Methode der Breite, wenn Gerät ist groß eingestellt Breite 50 sonst kleiner, aber diese Methode funktioniert nicht in iPhone SE, 5S/5, 6/6s/7 funktioniert nur mit iPhone 6 +/6S +/7 + !! Zum Beispiel wie dieseSwift 3 - Set XY Achse UILabel pro Gerät

enter image description here

Also, was falsch ist und welche Ergänzungen sollte ich hinzufügen ??

let lengthOfChar : CGFloat = data.ans.length // Characters form SQLite database 
let yAxis : CGFloat = self.view.frame.height/3 * 1.8 
let width: CGFloat = view.frame.size.width - 40 // frame width 
var targetWidth: CGFloat = (width - (lengthOfChar - 1) * 5)/lengthOfChar 

if targetWidth > 50 { 
    targetWidth = 50 
} 

let totalWidth: CGFloat = (targetWidth * lengthOfChar) + ((lengthOfChar - 5) * 5) 
let x : CGFloat = (width/2) - (totalWidth/2) 
let xx : CGFloat = (CGFloat(indexTar) * targetWidth) + (CGFloat(indexTar) * 5) + 20 
var xAxis : CGFloat = (x + xx) 
xAxis = width - xAxis 
+2

Verwenden auto.layout und es Einschränkungen ist viel einfacher und sehr leistungsfähig – Phyber

+0

es könnte einfacher für Sie sein, automatisches Layout zu verwenden – YoCoh

+0

I ca nicht, weil mein Projekt von Code erstellt wurde und ich kann das Projekt @Phyber nicht zurückgeben –

Antwort

0

Ich benutze eine Helfer Enum, die benutzerdefinierte Dinge für bestimmte iPhones tun können. Setzen Sie die enum und Verwendung unten.

hinzufügen neue Klasse mit diesem Code:

enum DeviceType: Int { 
    case iPhone4 = 1 
    case iPhone5 
    case iPhone6 
    case iPhone6Plus 
    case iPad 

    init(userInterfaceIdiom: UIUserInterfaceIdiom, screenHeight: CGFloat) { 
    switch (userInterfaceIdiom, screenHeight) { 
    case (.phone, 0..<568.0): 
     self = .iPhone4 
    case (.phone, 568.0..<667.0): 
     self = .iPhone5 
    case (.phone, 667.0..<736.0): 
     self = .iPhone6 
    case (.phone, 736.0..<CGFloat.infinity): 
     self = .iPhone6Plus 
    case (.pad, _): 
     self = .iPad 
    default: 
     self = .iPhone6 
    } 
    } 

    func isSameOrSmaller(than deviceType: DeviceType) -> Bool { 
    return self.rawValue <= deviceType.rawValue 
    } 
} 

Nutzungs:

if UIDevice.current.type().isSameOrSmaller(than: .iPhone5) { 
    // Do what you need 
} 
+0

Verwenden von Auto-Layout ist so viel einfacher. – Phyber

+0

@Phyber scheint er muss einige benutzerdefinierte Sachen tun –

+0

Wie heißt dieser Code in ViewController in meiner Funktion? @ TungFam –

0

Mit Auto-Layout in Code

label.translatesAutoresizingMaskIntoConstraints = false 

label.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 
label.heightAnchor.constraint(equalToConstant: 40).isActive = true 
label.widthAnchor.constraint(equalToConstant: 150).isActive = true 
label.topAnchor.constraint(equalTo: self.purpleBox.bottomAnchor, constant: 20).isActive = true 

Sie können Sie tun, was will damit. Das ist sehr mächtig.

einige andere Anker können Sie

// centerYAnchor 
// leftAnchor 
// rightAnchor 
// bottomAnchor 

Weiterführende Literatur verwenden: Working with Layout anchors

-1

ich mein Problem und diese einer Lösung gelöst:

postfix operator % 

postfix func % (percentage: CGFloat) -> CGFloat { 
    return (CGFloat(percentage)/100) 
} 

let yAxis : CGFloat = (self.view.frame.height) * 60% 

if lengthOfChar >= 8 { 

    targetWidth = 40 

} else { 

    targetWidth = 50 

} 
+0

Siehe diese Lösung und ich bin glücklich, Ihr Feedback zu mir zu geben :) @TungFam –

+0

Siehe diese Lösung und ich bin glücklich, Ihr Feedback zu mir zu geben :) @Phyber –

+0

Ich bin froh, dass dies für Sie funktioniert, aber hart kodieren Bildschirmhöhe und -breite ist sehr fragil und sollte wirklich nicht getan werden. – Abizern

Verwandte Themen