2017-08-03 11 views
1

私はXY軸のラベルとIの値を与えましたが、私の値はデバイスごとにセンターにラベルを付けませんでした。デバイスが大きい場合は幅のサイズのメソッドを書きました幅のサイズは50小さいですが、この方法はiPhone 6、6S +/7 +で動作するiPhone SE、5S/5、6/6s/7では動作しません!たとえば、このSwift 3 - デバイスごとにXY軸UILabelを設定する

enter image description here

ようなので、何が間違っていると私は何の追加を追加する必要があります?

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

使用auto.layoutと制約もはるかに簡単で非常に強力です – Phyber

+0

あなたは自動レイアウトを使用する方が簡単かもしれません – YoCoh

+0

私はca私のプロジェクトはコードで作成されたもので、プロジェクトを返すことはできません@Phyber –

答えて

0

私はヘルパー列挙型を使用しています。このヘルパー列挙型を使用すると、特定のiPhoneでカスタム作業を行うことができます。 enumusageを以下のように設定します。

このコードで新しいクラスを追加します。

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 
    } 
} 

使用

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

自動レイアウトを使用する方がはるかに簡単です。 – Phyber

+0

@Phyberは彼がカスタムのものをやる必要があると思われる –

+0

私の関数でこのコードをViewControllerで呼び出す方法は? @TungFam –

0

を自動レイアウトを使用してコード

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 

にあなたは何でも行うことができますそれで欲しい。これは非常に強力です。

あなたはさらに読書のため

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

を使用することができますいくつかの他のアンカー:Working with Layout anchors

-1

私は私の問題を解決し、この溶液:

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

は、このソリューションを参照してください、私は私にあなたのフィードバックを与えるために幸せです:) @TungFam –

+0

は、このソリューションを参照してください、私は私にあなたのフィードバックを与えるために幸せです:) @Phyber対象の質問に書きました –

+0

私はこれがあなたのために働く嬉しいんだけど、画面の高さと幅をハードコーディングすることは非常に脆弱であり、実際に行われるべきではありません。 – Abizern

関連する問題