Swift 背景图片不随子视图改变
Swift having image in background not changing with subview
我的视图一次显示 1 张图片,该图片应该是背景图片。我还在该图像之上添加了其他元素,这些元素应该会在触摸时发生变化。我的视图称为 VideoView 并且我在顶部有元素。所有这些都有效我的问题是,当我使用 insertSubview 时,顶部的所有元素都发生了变化(就像它们应该发生的那样)但图像保持不变(VideoView)并且它应该改变。如果我将 InsertSubView 替换为 addSubview,则图像会在单击时正确更改,但我的顶部元素不会显示。我知道我应该使用的是 insertSubview 并且在触摸时我可以看到图像 URL 发生变化,但屏幕保持第一个默认图像。
我想我知道可能会发生什么。每次点击我都会添加一个新的 InsertSubview 并且新图像可能位于旧图像的后面。我通过上传视频进行了验证。我首先有一个图像,当我点击进入下一个屏幕时,图像保持不变,但视频声音出现了。
class BookViewC: UIViewController{
@IBOutlet weak var VideoView: UIView!
var imageView: UIImageView?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// This is how I change images, touchCount number is linked with unique image depending on the number passed in .
for touch in touches {
let location = touch.location(in: self.VideoView)
if location.x < self.VideoView.layer.frame.size.width / 2 {
if touchCount == 0 || touchCount < 0 {
touchCount = 0
} else {
touchCount = touchCount - 1
}
reloadTable(Offset: touchCount)
}
else {
touchCount = touchCount + 1
reloadTable(Offset: touchCount)
}
}
}
func ShowImage(s_image: String) {
let imgURL: NSURL = NSURL(string: s_image)!
let request:NSURLRequest = NSURLRequest(url: imgURL as URL)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
bookviewImage.imageView = UIImageView(image: UIImage(named: s_image))
bookviewImage.imageView?.frame = VideoView.bounds
bookviewImage.imageView?.contentMode = UIViewContentMode.scaleAspectFill
let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in
DispatchQueue.main.async(execute: { () -> Void in
if data != nil {
self.bookviewImage.imageView?.image = UIImage(data: data!)
self.VideoView.insertSubview(self.bookviewImage.imageView!, at: 0)
// self.VideoView.addSubview(self.bookviewImage.imageView!)
} else {
self.bookviewImage.imageView!.image = nil
}
})
});
task.resume()
}
func reloadTable(Offset: Int) {
// send http request
session.dataTask(with:request, completionHandler: {(data, response, error) in
if error != nil {
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any]
if let Streams = parsedData["Results"] as? [AnyObject]?
{
if self.streamsModel.Locations.count >= 0 {
// Get Results
}
DispatchQueue.main.async {
for Stream in Streams! {
if let s_image = Stream["stream_image"] as? String {
self.ShowImage(s_image: s_image)
}
}
}
InsertSubview 上的背景图片在点击时不会改变,但是当我添加 AddSubview 时,背景图片会发生变化,所以我知道我的代码有问题,因为 InsertSubview 背景图片没有更新
[![.][2]][2]
我不确定您是如何更改图片的,可能需要查看代码才能提供更好的解释。同时,你应该明白insertSubview
和addSubview
的区别。
添加子视图:
addSubview
在列表末尾添加一个视图。在层次结构中,这将是最底部的项目。然而,在屏幕上,它将是最上面的项目,覆盖它下面的所有内容。
层次结构看起来像
- 查看
- 视频观看
- 个人资料图片
- 时间
- 全名
- Post
- 按钮
- imageView
插入子视图:
insertSubview
在列表中的给定位置插入一个视图。您的代码在位置 0 处插入。在层次结构中,这将是最顶层的项目。然而,在屏幕上,它将是最底部的项目,被其顶部的所有内容覆盖。
层次结构看起来像
- 查看
- 视频观看
- imageView
- 个人资料图片
- 时间
- 全名
- Post
- 按钮
希望对您有所帮助。
我的视图一次显示 1 张图片,该图片应该是背景图片。我还在该图像之上添加了其他元素,这些元素应该会在触摸时发生变化。我的视图称为 VideoView 并且我在顶部有元素。所有这些都有效我的问题是,当我使用 insertSubview 时,顶部的所有元素都发生了变化(就像它们应该发生的那样)但图像保持不变(VideoView)并且它应该改变。如果我将 InsertSubView 替换为 addSubview,则图像会在单击时正确更改,但我的顶部元素不会显示。我知道我应该使用的是 insertSubview 并且在触摸时我可以看到图像 URL 发生变化,但屏幕保持第一个默认图像。
我想我知道可能会发生什么。每次点击我都会添加一个新的 InsertSubview 并且新图像可能位于旧图像的后面。我通过上传视频进行了验证。我首先有一个图像,当我点击进入下一个屏幕时,图像保持不变,但视频声音出现了。
class BookViewC: UIViewController{
@IBOutlet weak var VideoView: UIView!
var imageView: UIImageView?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// This is how I change images, touchCount number is linked with unique image depending on the number passed in .
for touch in touches {
let location = touch.location(in: self.VideoView)
if location.x < self.VideoView.layer.frame.size.width / 2 {
if touchCount == 0 || touchCount < 0 {
touchCount = 0
} else {
touchCount = touchCount - 1
}
reloadTable(Offset: touchCount)
}
else {
touchCount = touchCount + 1
reloadTable(Offset: touchCount)
}
}
}
func ShowImage(s_image: String) {
let imgURL: NSURL = NSURL(string: s_image)!
let request:NSURLRequest = NSURLRequest(url: imgURL as URL)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
bookviewImage.imageView = UIImageView(image: UIImage(named: s_image))
bookviewImage.imageView?.frame = VideoView.bounds
bookviewImage.imageView?.contentMode = UIViewContentMode.scaleAspectFill
let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in
DispatchQueue.main.async(execute: { () -> Void in
if data != nil {
self.bookviewImage.imageView?.image = UIImage(data: data!)
self.VideoView.insertSubview(self.bookviewImage.imageView!, at: 0)
// self.VideoView.addSubview(self.bookviewImage.imageView!)
} else {
self.bookviewImage.imageView!.image = nil
}
})
});
task.resume()
}
func reloadTable(Offset: Int) {
// send http request
session.dataTask(with:request, completionHandler: {(data, response, error) in
if error != nil {
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any]
if let Streams = parsedData["Results"] as? [AnyObject]?
{
if self.streamsModel.Locations.count >= 0 {
// Get Results
}
DispatchQueue.main.async {
for Stream in Streams! {
if let s_image = Stream["stream_image"] as? String {
self.ShowImage(s_image: s_image)
}
}
}
InsertSubview 上的背景图片在点击时不会改变,但是当我添加 AddSubview 时,背景图片会发生变化,所以我知道我的代码有问题,因为 InsertSubview 背景图片没有更新
[![.][2]][2]
我不确定您是如何更改图片的,可能需要查看代码才能提供更好的解释。同时,你应该明白insertSubview
和addSubview
的区别。
添加子视图:
addSubview
在列表末尾添加一个视图。在层次结构中,这将是最底部的项目。然而,在屏幕上,它将是最上面的项目,覆盖它下面的所有内容。
层次结构看起来像
- 查看
- 视频观看
- 个人资料图片
- 时间
- 全名
- Post
- 按钮
- imageView
- 视频观看
插入子视图:
insertSubview
在列表中的给定位置插入一个视图。您的代码在位置 0 处插入。在层次结构中,这将是最顶层的项目。然而,在屏幕上,它将是最底部的项目,被其顶部的所有内容覆盖。
层次结构看起来像
- 查看
- 视频观看
- imageView
- 个人资料图片
- 时间
- 全名
- Post
- 按钮
- 视频观看
希望对您有所帮助。