Программно добавление / удаление изображений в Subview в Swift - PullRequest
0 голосов
/ 29 декабря 2018

Используя код из другого поста, я смог программно нарисовать и стереть подпредставление, в том числе местоположение, ширину и высоту, как показано в func addLoadButton и func removeSubview ниже.Я также выяснил, как программно нарисовать картинку на главном контроллере вида, как показано в func trailerLoadImage ниже.Однако после многих часов и попыток я безуспешно пытался программно добавлять и удалять изображения в этом подпредставлении.

Моя конечная цель - иметь возможность нажимать три разные кнопки типа загрузки трейлера, чтобы вставить три разных изображения (кнопка 1 загружает изображение 1, кнопка 2 загружает изображение 2 и т. д.) в подпредставление, расположенное в определенном месте на экране, и чтобы можно было удалять изображения по одному (возможно, не в порядке, отображаемом на экране) с помощьюнажав на изображения пальцем.Подвид может быть постоянным или может быть создан и удален программно (как используется ниже).

Какой код я бы использовал, чтобы вставить изображение или несколько различных изображений в уже созданное подпредставление, чтобы удалить изображение(s) в обратном порядке добавлено, и очистить все изображения из подпредставления?Если это невозможно, приемлемой альтернативой будет возможность удалить изображение из основного ВК, нажав на него или нажав кнопку, чтобы очистить все добавленные изображения.

//Class declaration
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    //Boolean to include load type one in calculations
    var trailerLoad : Bool = false
    var trailerLoadDistanceFromFront = 20

    //Boolean to include load type two in calculations
    var trailerLoadTwo : Bool = false
    var trailerLoadTwoDistanceFromFront = 80

    //Boolean to include load type three in calculations
    var trailerLoadThree : Bool = false
    var trailerLoadThreeDistanceFromFront = 120

    var trailerLoadWidth : Int = 0
    var trailerLoadX : Int = 0

    //Boolean true only when subView on trailer is active
    var subViewActive : Bool = false


    override func viewDidLoad() {
        super.viewDidLoad()

        //Picker view data sources and delegates included in here and work fine
    }


    //Adds subview for loads
    @IBAction func addLoadButton(_ sender: Any) {

        let trailerLoadView: UIView = UIView(frame: CGRect(x: 252, y: 233, width: 378, height: 100))
        trailerLoadView.backgroundColor = .blue
        trailerLoadView.alpha = 0.5
        trailerLoadView.tag = 100
        trailerLoadView.isUserInteractionEnabled = true
        self.view.addSubview(trailerLoadView)

        subViewActive = true
    }


    //If subViewActive is true, calls alert to get distance load type one is from front, moves on to insert and position image, changes trailerLoad bool to true
    @IBAction func trailerLoadOneButton(_ sender: Any) {
        //If subViewActive is true:
            //Calls alert to get distance load type one is from front, puts in var trailerLoadDistanceFromFront
            //Calls trailerLoadImage() to insert and position load type one image
            //Changes bool trailerLoad to true
        //If subViewActive is false:
            //Calls alert to tell user that they need to click Add Load button (create subview) before adding load types one, two, or three
    }


    //Add trailer load type one image, scales and positions it relatively accurately in view.
    //To be duplicated and modified for load types two and three in the future, with different images (trailerLoadTypeTwoPic and trailerLoadTypeThreePic)
    func trailerLoadImage() {

        trailerLoadWidth = 378 * 60 / trailerTotalLength
        trailerLoadX = 378 * trailerLoadDistanceFromFront / trailerTotalLength

        let imageView = UIImageView(frame: CGRect(x: (252 + trailerLoadX), y: (333 - trailerLoadWidth), width: trailerLoadWidth, height: trailerLoadWidth));
        let image = UIImage(named: “trailerLoadTypeOnePic”);

        imageView.image = image;
        self.view.addSubview(imageView)
    }


    //Calls func removeSubview to remove subview
    @IBAction func resetButton(_ sender: Any) {

        removeSubview()
    }


    //Removes subview for loads
    @objc func removeSubview(){

        subViewActive = false

        if let viewWithTag = self.view.viewWithTag(100) {
            viewWithTag.removeFromSuperview()
        }else{
            print("No!")
        }
    }
}

Спасибо большоевсем, кто предлагает помощь или совет.

1 Ответ

0 голосов
/ 29 декабря 2018

Не используйте теги!Просто создайте переменные в глобальной области видимости для ваших представлений

var imageViews = [UIImageView]()

, затем, когда вам нужно добавить их, сначала добавьте их в ваш массив, а затем добавьте их в view

imageViews.append(imageView)
view.addSubview(imageView)

Затем, когдавам нужно удалить все ваши представления из их суперпредставления, используйте метод removeFromSuperview() для каждого представления в массиве

imageViews.forEach { $0.removeFromSuperview() }
imageViews.removeAll()

или если вам нужно удалить только одно представление по определенному индексу

imageViews[index].removeFromSuperview()
imageViews.remove(at: index)
...