如何刷新通过 addSubview 添加的图像?

Posted

技术标签:

【中文标题】如何刷新通过 addSubview 添加的图像?【英文标题】:How to refresh images added via addSubview? 【发布时间】:2015-10-04 08:13:38 【问题描述】:

我有视图 - 卡片,就像在 Tinder 中一样,我想通过 addSubview 将图像添加到这些卡片中。我做到了,所有的工作,但在这里我有一些问题:

例如,我有 3 张卡片和一个数组 images。当我刷卡时,我会增加我的cardIndex++。因此,当我刷卡时,我会打印 cardIndex,它会在日志中正确显示我。图像名称也可以正确打印,但我的卡片上的图像没有改变。

如何在显示新图片之前更新我的卡片视图?

我尝试在显示图像后将 imageView 设置为 nil,但它也不起作用:

_ = UIImageView(image: nil)

这是我的功能:

        var images = ["apple.jpg", "orange.jpg", "banana.jpg"]
        swipeableView.nextView = 
            let cardView = CardView(frame: self.swipeableView.bounds)
            cardView.backgroundColor = UIColor.whiteColor()

            if self.loadCardsFromXib 
                let contentView = NSBundle.mainBundle().loadNibNamed("CardContentView", owner: self, options: nil).first! as! UIView

                contentView.translatesAutoresizingMaskIntoConstraints = false
                contentView.backgroundColor = cardView.backgroundColor

                let cardHeight = self.swipeableView.frame.height
                let cardWidth = self.swipeableView.frame.width

                // Mark: Adding Image to cards
                let image = UIImage(named: self.images[self.cardIndex])
                let imageView = UIImageView(image: image!)
                imageView.frame = CGRect(x: 0, y: 0, width: cardWidth, height: cardHeight - 70)
                contentView.addSubview(imageView)

                cardView.addSubview(contentView)

                _ = UIImageView(image: nil)
            

            return cardView
       

更新

    swipeableView.didStart = view, location in
        if self.cardIndex+1 < self.swipeableView.numPrefetchedViews 
            self.cardIndex++
        
    

【问题讨论】:

_ = UIImageView(image: nil) 应该是什么意思?它不会将 imageView 设置为 nil。 @mixel 你能提供一些解决方法吗? 【参考方案1】:

你应该在swipeableView.nextView闭包中检查并增加cardIndex

var images = ["apple.jpg", "orange.jpg", "banana.jpg"]
self.cardIndex = 0
swipeableView.nextView = 

    if self.cardIndex >= images.count 
        return nil
    

    let cardView = CardView(frame: self.swipeableView.bounds)
    cardView.backgroundColor = UIColor.whiteColor()

    if self.loadCardsFromXib 
        let contentView = NSBundle.mainBundle().loadNibNamed("CardContentView", owner: self, options: nil).first! as! UIView

        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.backgroundColor = cardView.backgroundColor

        let cardHeight = self.swipeableView.frame.height
        let cardWidth = self.swipeableView.frame.width

        // Mark: Adding Image to cards
        let image = UIImage(named: self.images[self.cardIndex])
        let imageView = UIImageView(image: image!)
        imageView.frame = CGRect(x: 0, y: 0, width: cardWidth, height: cardHeight - 70)
        contentView.addSubview(imageView)

        cardView.addSubview(contentView)
    
    self.cardIndex++
    return cardView

要获取当前显示卡索引,您应该定义其他currentCardIndex

let currentCardIndex = 0

并设置swipeableView.didSwipe:

swipeableView.didSwipe = 
    _, _, _ in
    self.currentCardIndex++

【讨论】:

我增加了它,我在我的问题中是如何描述的。我只是没有将此代码添加到我的问题中。请再看看我的问题。我已经更新了它。因此,它会增加并显示正确的图像标题,但不会更改图像 你确定swipeableView.didStartswipeableView.nextView之前执行吗?当self.swipeableView.numPrefetchedViews 为 1 时,在显示第一张卡片后,self.cardIndex+1 &lt; self.swipeableView.numPrefetchedViews 似乎为假。 如果你愿意,我可以给你发一个项目。粘贴到Github上,你可以看看 它在这里:github.com/orkhanalizade/StackO 必须改变苹果 - 橙色 - 苹果 - 橙色,但不是这个,而是改变苹果 - 橙色并保持橙色 正如我所说,您没有正确检查和增加cardIndex。你应该在swipeableView.nextView 中而不是在swipeableView.didStart 中进行。【参考方案2】:

您需要保持对 UIImageView 的引用(通过创建类级别/全局变量)并在滑动时设置新图像。像这样的:

var imageView : UIImageView // Declare in global context - outside all class functions

然后从内部函数访问它(第一次和图像索引的任何变化):

imageView = UIImageView(image: image!) // Do not re-define like let imageView

【讨论】:

您能否展示一下您是如何做到这一点的。这必须有效。在您当前的代码中,您有一个 UIImageView 的本地引用,这就是您无法更改图像的原因。您能否在最初设置它的位置显示代码,然后将其重置回来。 我按照你说的做:class ViewController: UIViewController var imageView : UIImageView! 以及后来我上面描述的方法,没有let,只有imageView 应该可以的。或者,您能否尝试在您的 CardView 类中添加一个 imageView 变量。在您的自定义视图CardView 类中添加一个图像视图。设置为cardView.imageView.image = &lt;Your_First_Image&gt;。保持对cardView 对象的全局引用,然后在选择新图像时只需调用cardView.imageView.image = &lt;Your_Second_Image&gt; 你能分享你项目的github链接吗? @OrkhanAlizade 它在这里:github.com/orkhanalizade/StackO 必须改变苹果 - 橙色 - 苹果 - 橙色,但不是这个,而是改变苹果 - 橙色并保持橙色

以上是关于如何刷新通过 addSubview 添加的图像?的主要内容,如果未能解决你的问题,请参考以下文章

addSubview 将我的视图变为默认视图

通过 addSubview 添加后,在父 UIViewController 中调用方法

如何添加不与更新内容功能冲突的自动图像幻灯片放映

UINavigationBar 外观 addSubview 在 iOS 8 中不起作用

UIScrollView addSubView:如何防止重新添加相同的 UILabel 实例?

使用 addSubview 动态添加 UITextField 的 UITableViewCell - 如何在键盘上“返回”时获取 UITextField 值