簡體   English   中英

每次調用 Func 時都會重寫 UIView

[英]UIView is Being Over Written Every Time Func is Called

我的 swift 代碼目標是每次按下按鈕時放置一個 uiview。 在我的 gif 中,您可以看到每次調用藍色按鈕時都會被覆蓋。 當按下代碼時,gif 中應該有 2 個 uiviews。 您可以看到第一個視圖消失的透明uiview。 基本上,這段代碼的所有錯誤在於當 addBlackView 被調用時,它應該像一個無限數組一樣添加到屏幕上的視圖中。

在此處輸入圖片說明

import UIKit
class ViewController: UIViewController {

var image1Width2: NSLayoutConstraint!
var iHieght: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white

    view.addSubview(slider)
    slider.translatesAutoresizingMaskIntoConstraints = false
    slider.value = 0.5
    slider.isUserInteractionEnabled = true
    NSLayoutConstraint.activate([
        slider.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
        slider.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        slider.heightAnchor.constraint(equalToConstant: 100),
        slider.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
    ])

    view.addSubview(button)
    button.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
        button.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
        button.widthAnchor.constraint(equalToConstant: 100),
        button.heightAnchor.constraint(equalToConstant: 80),
    ])
    button.addTarget(self,action: #selector(addBlackView),for: .touchUpInside)
    slider.addTarget(self, action: #selector(increase), for: .allEvents)

}

let slider:UISlider = {
    let slider = UISlider(frame: .zero)
    return slider
}()

private lazy var button: UIButton = {
    let button = UIButton()
    button.backgroundColor = .blue
    button.setTitleColor(.white, for: .normal)
    button.setTitle("add", for: .normal)
    return button
}()

let blackView: UIView = {
    let view = UIView()
    view.backgroundColor = .black
    return view
}()

@objc
private func addBlackView() {
    self.view.addSubview(blackView)
    blackView.translatesAutoresizingMaskIntoConstraints = false
    blackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    blackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    image1Width2 = blackView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.1)
    image1Width2.isActive = true
    iHieght = blackView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.1)
    iHieght.isActive = true
    view.layoutIfNeeded()

    let recognizer = UIPanGestureRecognizer(target: self, action: #selector(moveView(_:)))
    blackView.addGestureRecognizer(recognizer)
}

@objc private func moveView(_ recognizer: UIPanGestureRecognizer) {
    switch recognizer.state {
    case .began:
        print("gesture began")
    case .changed:
        let translation = recognizer.translation(in: self.view)

        recognizer.view!.center = .init(x: recognizer.view!.center.x + translation.x,
                                        y: recognizer.view!.center.y + translation.y)
        recognizer.setTranslation(.zero, in: self.view)
    default:
        break
    }
}

@objc func increase() {
    image1Width2.constant = CGFloat(slider.value) * view.frame.size.width * 0.10
    iHieght.constant = CGFloat(slider.value) * view.frame.size.width * 0.10
}}

問題是,你打算重用和重置blackView每次執行時間addBlackView ,所以您所做的更改將丟失(所以為什么認為可以追溯到在中心,你按下按鈕后)。

您需要在addBlackView創建一個完整的新視圖,這將是您正在操作的“currentView”,然后向其中添加手勢識別器。 然后一旦你再次執行addBlackView ,'currentView' 將被'驗證'(存儲在一個數組或任何你需要用它做的事情中),然后你創建另一個來操作。

像這樣的東西:

private func addBlackView() {
    let newBlackView = UIView(frame: CGRect(0, 0, 10, 10)) // whatever frame you want
    self.view.addSubview(newBlackView)
    self.currentView = newBlackView
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM