Search code examples
swiftdatabasesqliteuilabelcgrect

Organize and adjust the UILabel position per devices - Swift 3


I have SQLite database file and UILabel, and I set text for label from database on the number of characters after convert String to Characters, and I added extension its name (length), its job counts the number of characters.

enter image description here

My problem in this picture is : The UILabels are not organized in sizes and positions in per devices I want them to have their positions in the center of X-Axis

Questions:

1) How to set the label into center and set spaces right and left of screen for labels (per device) ??

2) How to set width for labels if device is iPhone 7/6S/6 plus width = 50, if device is iPhone 7/6S/6 width = 45 and if device is iPhone SE/5S/5C/5 width = 38 ??

3) Finally, how does the label become smaller by 10 if the number of characters is more than 8 ?

This my code :

func createTarget(id: Int) {

    listdata = dbHelpr.getDatabase(rowId: id)

    for data in listdata {

        let lengthOfChar : CGFloat = data.ans.length
        let yAxis : CGFloat = (self.view.frame.height) * 60%
        let width: CGFloat = view.frame.size.width - 40 // frame width
        var targetWidth: CGFloat = (width - (lengthOfChar - 1) * 5) / lengthOfChar
        let targetHeigt : CGFloat = 5

        if lengthOfChar >= 8 {
            targetWidth = 40
        } else {
            targetWidth = 50
        }

        let totalWidth: CGFloat = (targetWidth * lengthOfChar) + ((lengthOfChar - 5) * 5)

        for (indexTar, tar) in data.ans.characters.enumerated() {

            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



            let targetLabel = UILabel(frame: CGRect(x: xAxis, y: yAxis, width: targetWidth, height: targetHeigt))
            targetLabel.backgroundColor = .white
            targetLabel.layer.masksToBounds = true
            targetLabel.layer.cornerRadius = 5
            targetLabel.text = String(describing: tar)
            targetLabel.textAlignment = .center
            targetLabel.textColor = .white
            self.view.addSubview(targetLabel)

        }

    }

}

Solution

  • I solved my problem and this answer :

    func createTarget(id: Int) {
    
        listdata = dbHelpr.getDatabase(rowId: id)
        var targetHeigt = CGFloat()
        let viewWidth = self.view.frame.size.width
        if viewWidth == 320 {
            targetHeigt = 2.5
        } else {
            targetHeigt = 5
        }
    
        for data in listdata {
            let yAxis : CGFloat = (self.view.frame.height) * 60%
            let i = data.ans.length
            // char count
            let width: Int = Int(view.frame.size.width) - 40
    
            // frame width
            var targetWidth: Int = (width - (i - 1) * 5) / i
    
            if targetWidth > 50 {
                targetWidth = 50
            }
            let totalWidth: Int = (targetWidth * i) + ((i - 1) * 5)
    
            for x in 0..<i {
                let currentWidth: Int = (width / 2) - (totalWidth / 2) + (x * targetWidth) + (x * 5) + 20
    
                let targetLabel = UILabel(frame: CGRect(x: CGFloat(currentWidth), y: yAxis, width: CGFloat(targetWidth), height: targetHeigt))
                targetLabel.backgroundColor = .white
                targetLabel.layer.masksToBounds = true
                targetLabel.layer.cornerRadius = 5
                targetLabel.textAlignment = .center
                targetLabel.textColor = .white
    
                for i in listdata {
                    let tar = data.ans.characters.map{String($0)}
                    targetLabel.text = String(describing: tar)
                }
                self.view.addSubview(targetLabel)
            }
        }
    }