как перенести часть символов ниже других в swift - PullRequest
0 голосов
/ 12 апреля 2020

введите описание изображения здесь > Я делаю игру в слова, проблема в этом. Когда слово большое, ячейки

выходят из экрана, мне нужно, чтобы эти ячейки двигались ниже других ячеек и были центрированы. и ячейки должны иметь фиксированную ширину = 20. это все в моей справке приложения.

ps Я пытался добавить элементы в представление стека, но пробел между словами не отображался в представлении стека.

     1. TileView.swift

     import UIKit

    protocol TileDragDelegateProtocol {
         func tileView(tileView: TileView, didDragToPoint: CGPoint)
    }

    class TileView: UIImageView {

        var letter: Character?
        var isMatch = false

        private var xOffset: CGFloat = 0.0
        private var yOffset: CGFloat = 0.0
        var dragDelegate: TileDragDelegateProtocol?

    init(letter: Character, sideLength: CGFloat) {
         self.letter = letter
        //let scale = CGRect(x: 0, y: 0, width: self.bounds.size.width /* scale*/, height: self.bounds.size.height  /** scale*/)
//        super.init(frame: scale)
//        let scale = CGRect(x: 0, y: 0, width: self.bounds.size.width /* scale*/, height: self.bounds.size.height  /** scale*/)
        let image = UIImage(named: "tile")
        super.init(image: image)
        let scale = sideLength / (image?.size.width)! 
        self.frame = CGRect(x: 0, y: 0, width: (image?.size.width)! * scale, height: (image?.size.height)! * scale)

       // self.frame = CGRect(x: 0, y: 0, width: self.bounds.size.width /* scale*/, height: self.bounds.size.height  /** scale*/)
        //self.layer.cornerRadius = 23
        //self.clipsToBounds = true

        let letterLabel = UILabel(frame: self.bounds)
        letterLabel.textAlignment = .center
        letterLabel.textColor = .white
        letterLabel.backgroundColor = .clear
        letterLabel.text = String(letter).uppercased()
        letterLabel.font = .boldSystemFont(ofSize: 40.0 / 3) //.systemFont(ofSize: 78.0 / 3/*scale*/)
        //letterLabel.layer.cornerRadius = 23
        //letterLabel.clipsToBounds = true
//        self.backgroundColor = .red
//        self.textAlignment = .center
//        self.textColor = .white
//        self.backgroundColor = .black
//        self.text = String(letter).uppercased()
//        self.font = .boldSystemFont(ofSize: 50.0 / 3)
        self.addSubview(letterLabel)
        self.isUserInteractionEnabled = true


    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
          let point = touch.location(in: self.superview)
          xOffset = point.x - self.center.x
          yOffset = point.y - self.center.y
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        if let touch = touches.first {
            let point = touch.location(in: self.superview)
            self.center = CGPoint(x: point.x - xOffset, y: point.y - yOffset)
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.touchesMoved(touches, with: event)
        dragDelegate?.tileView(tileView: self, didDragToPoint: self.center)
    }

}


 2.TargetView.swift

import UIKit

class TargetView: UILabel {

    var letter: Character!
    var isMatch = false

    init(letter: Character, sideLength: CGFloat) {
        self.letter = letter

        //let image = UIImage(named: "slot")
        //super.init(image: image)
        //let scale = CGRect(x: 0, y: 0, width: (image?.size.width)! * scale, height: (image?.size.height)! * scale)
        super.init(frame: CGRect(x: 0, y: 0, width: 15, height: 30))
        self.backgroundColor = .red
        self.textAlignment = .center
        self.font = .boldSystemFont(ofSize: 60.0 / 3)
        self.text = "_"//String(letter).uppercased()
        self.textColor = .white
        self.lineBreakMode = .byWordWrapping
        self.adjustsFontSizeToFitWidth = true

    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}


 3. ViewController 

import UIKit

class ViewController: UIViewController {

//    let ScreenWidth = UIScreen.main.bounds.size.width
//    let ScreenHeight = UIScreen.main.bounds.size.height
    //frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
    //var gameView = UIView()
    private var tiles = [TileView]()
    private var targets = [TargetView]()
    let tileMargin : CGFloat = 0.0
    var words = "Hellomyf rie nds?"

//    lazy var stackView: UIStackView = {
//        let stack = UIStackView()
//        stack.axis = .horizontal
//        stack.spacing = 0
//        stack.distribution = .fillEqually
//        stack.translatesAutoresizingMaskIntoConstraints = false
//        return stack
//    }()
//
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .lightGray
        dealRandomAnagram()
}

    func dealRandomAnagram() {

        let anagram1 = words
        let anagram1length = anagram1.count

        print("phrase1[\(anagram1length)]: \(anagram1)")
        // Рассчет размера плитки //Tile size calculation
        let tileSize = ceil(UIScreen.main.bounds.size.width * 0.8 / CGFloat(min(anagram1length, anagram1length))) + tileMargin   // * 1

        //Поиск х позиции первой плитки // Finding x position of the first tile

        var xOffset = (UIScreen.main.bounds.size.width - CGFloat(max(anagram1length, anagram1length)) * (15 + tileMargin)) / 2.0
            //+ tileMargin

        //let yOffset = (UIScreen.main.bounds.size.height - CGFloat(max(anagram1length, anagram1length)) * (15 + tileMargin)) / 2.0
                   //+ tileMargin

        //настройка центра плитки (вместо источника плитки)
        xOffset += tileSize / 2.0


        tiles = []

        // создание плитки
        for (index, letter) in anagram1.enumerated() {
            if letter != " " {
                let tile = TileView(letter: letter, sideLength: tileSize)
                tile.center = CGPoint(x: xOffset  + CGFloat(index)  * (tileSize + tileMargin), y: UIScreen.main.bounds.size.height/4*3)
                view.addSubview(tile)
                tile.dragDelegate = self
                tiles.append(tile)
            }
        }


        targets = []

        for (index,letter) in anagram1.enumerated() {
            let target = TargetView(letter: letter, sideLength: 15)
            if letter != " " || index > 15 {
               // let target = TargetView(letter: letter, sideLength: 15)
                target.center = CGPoint(x: xOffset + CGFloat(index) /* * 20 */ * (15 + tileMargin), y: UIScreen.main.bounds.size.height - 100) //100 //UIScreen.main.bounds.size.height - CGFloat(index) * 50
               view.addSubview(target)
               targets.append(target)
                //stackView.addArrangedSubview(target)
                //targets.append(target)
            }
        }
    }

    //xOffset + CGFloat(index) /* * 20 */ * (tileSize + tileMargin )

    //UIScreen.main.bounds.size.height - 100
    func placeTile(tileView: TileView, targetView: TargetView) {

        tileView.isMatch = true
        targetView.isMatch = true

        tileView.isUserInteractionEnabled = false

        UIView.animate(withDuration: 0.35, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
            tileView.center = targetView.center
            tileView.backgroundColor = .clear
            targetView.transform = .identity
        }, completion: {
            (value: Bool) in
            targetView.isHidden = true 
        })
    }

    func checkValidate() {

        for targetView in targets {
            if !targetView.isMatch {
                return
            }
        }
        print("Valid")
    }
}


extension ViewController: TileDragDelegateProtocol {
    func tileView(tileView: TileView, didDragToPoint: CGPoint) {
        var targetView: TargetView?
           for tv in targets {
            if tv.frame.contains(didDragToPoint) && !tv.isMatch {
               targetView = tv
               break
          }
       }

        if let targetView = targetView {

        //2 check if letter matches
        if targetView.letter == tileView.letter {

          //3
            self.placeTile(tileView: tileView, targetView: targetView)
            print("Success! You should place the tile here!")

            //more stuff to do on success here
            self.checkValidate()
            print("Check if the player has completed the phrase")
          } else {

          //4

            UIView.animate(withDuration:0.35,
            delay:0.00,
            options :UIView.AnimationOptions.curveEaseOut,
            animations: {
                tileView.center = CGPoint(x: tileView.center.x,
                                          y: tileView.center.y - (200))
            },
            completion: nil)
            print("Failure. Let the player know this tile doesn't belong here")

          //more stuff to do on failure here
        }
    }
   }
}
...