每次调用Func时,UIView都会被覆盖

乔·巴克

我的快速代码目标是每次按下按钮时都放置一个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
}}
mxlhz

问题是您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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

每次调用Func时,UIView都会被覆盖-Swift

每次创建新实例时,ArrayList都会被覆盖

PHP-每次我保存文件时,旧数据都会被覆盖

每次执行gettext.extract()时,.pot文件都会被覆盖-旧的翻译丢失

每次更改变量时,CSV 文件中的行都会被覆盖

Hybris自定义表每次都会被覆盖

调用printf时,为什么EDX的值会被覆盖?

取消引用向量以设置值时,整个向量都会被覆盖

无论顺序如何,pip --editable 都会被覆盖

ArrayList中的所有数组都会被覆盖

避免直接改变 prop,因为每当父组件重新渲染时,值都会被覆盖。反而

每次调用函数时,函数内部的变量是否都会被销毁并重新初始化?

保存图形时,刻度标签会被覆盖

当多个文件处于活动状态时,Filereader会被覆盖

使用highcharts时React道具会被覆盖吗?

每次调用Angular Service时都会重置

有没有一种方法可以在调试时永久更改变量的值,以使其在后续调用中不会被覆盖?

HTML / JavaScript:每次下载时都会覆盖文件

每次调用notifyDataSetChanged()时,都会调用onBindViewHolder()

Bootstrap CSS不会被覆盖吗?

为什么数组会被覆盖?

sftp get -r不会被覆盖

为什么提示会被覆盖?

导入同名功能会被覆盖吗?

财产子女会被覆盖吗?

Swift属性观察不会被覆盖

当我尝试从线程写入文件的每个块时,它会被覆盖

使用id选择器时css裁定不会被覆盖

为什么在函数内部创建同名变量时函数参数不会被覆盖?