如何刷新通过 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.didStart
在swipeableView.nextView
之前执行吗?当self.swipeableView.numPrefetchedViews
为 1 时,在显示第一张卡片后,self.cardIndex+1 < 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 = <Your_First_Image>
。保持对cardView
对象的全局引用,然后在选择新图像时只需调用cardView.imageView.image = <Your_Second_Image>
你能分享你项目的github链接吗? @OrkhanAlizade
它在这里:github.com/orkhanalizade/StackO 必须改变苹果 - 橙色 - 苹果 - 橙色,但不是这个,而是改变苹果 - 橙色并保持橙色以上是关于如何刷新通过 addSubview 添加的图像?的主要内容,如果未能解决你的问题,请参考以下文章
通过 addSubview 添加后,在父 UIViewController 中调用方法
UINavigationBar 外观 addSubview 在 iOS 8 中不起作用
UIScrollView addSubView:如何防止重新添加相同的 UILabel 实例?
使用 addSubview 动态添加 UITextField 的 UITableViewCell - 如何在键盘上“返回”时获取 UITextField 值