为什么我不能使用图像变量来更改 UI 图像中的图像
Why can't I use an image variable to change the image inside of a UI Image
我正在尝试创建一组 5 个具有不同图像和文本的引导屏幕。为了使我的代码更清晰,我只需要一个为当前屏幕设置图像的函数。
我当前的功能是这样的:
private let facebookImage: UIImageView = {
let image = #imageLiteral(resourceName: "facebook_icon")
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}()
我希望能够做这样的事情...
private let displayImage: UIImageView = {
let image = currentImage
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
return imageView
}()
我可以将 currentImage
变量更改为在 class:
中声明的图像文字
var twitter : UIImage = #imageLiteral(resourceName: "twitter_icon")
var facebook : UIImage = #imageLiteral(resourceName: "facebook_icon")
var linkedin : UIImage = #imageLiteral(resourceName: "linkedin_icon")
var instagram : UIImage = #imageLiteral(resourceName: "instagram_icon")
var youtube : UIImage = #imageLiteral(resourceName: "youtube_icon")
weak var currentImage : UIImage?
当我收到错误时,我的问题就来了:Instance member 'currentImage' cannot be used on type 'ViewController'
我不明白为什么。我已经查看了其他相关问题,但它们似乎没有帮助。
这里你需要一个函数而不是一个实例属性
func getImgaeV(_ imageName:String) -> UIImageView {
let imageView = UIImageView(image: imageName)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}
有
facebookImage = getImgaeV("facebook_icon")
twitterImage = getImgaeV("twitter_icon")
我认为你们的属性有些相似,所以你可以这样做
var allImageViews = [UIImageView]()
然后里面 viewDidLoad
allImageViews = ["facebook_icon","twitter_icon"].map { getImgaeV([=13=]) }
我不确定这是否是最佳做法,但我基本上初始化了我想更新的图像并使用 else if 语句来更改图像。
import UIKit
class ViewController: UIViewController {
var tapCount : Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.addSubview(displayImage)
view.addSubview(displayText)
setupControls()
setupLayout()
}
// Initalized the display image to facebook icon and is updated when next or previous is tapped
private let displayImage: UIImageView = {
let imageName = "facebook_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}()
private let displayText: UITextView = {
let textView = UITextView()
let attributedText = NSMutableAttributedString(string: "Like us on Facebook", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)])
attributedText.append(NSAttributedString(string: "\n\n\nLorem ipsum Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.gray]))
textView.attributedText = attributedText
textView.textAlignment = .center
textView.isEditable = false
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
private let nextButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("NEXT", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside)
return button
}()
@objc func nextButtonTapped() {
tapCount += 1
pageCounter.currentPage += 1
updatePageContent()
print("NEXT \(tapCount)")
}
@objc func backButtonTapped() {
tapCount -= 1
pageCounter.currentPage -= 1
updatePageContent()
print("PREV \(tapCount)")
}
func updatePageContent() {
if tapCount == -1 {
tapCount = 0
} else if tapCount == 0 {
displayImage.image = facebookImage.image
} else if tapCount == 1 {
displayImage.image = twitterImage.image
} else if tapCount == 2 {
displayImage.image = instagramImage.image
} else if tapCount == 3 {
displayImage.image = linkedinImage.image
} else if tapCount == 4 {
displayImage.image = youtubeImage.image
} else if tapCount == 5 {
tapCount = 4
}
}
private let previousButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("PREV", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return button
}()
private let pageCounter: UIPageControl = {
let control = UIPageControl()
control.currentPage = 0
control.numberOfPages = 5
control.currentPageIndicatorTintColor = .systemBlue
control.pageIndicatorTintColor = .gray
return control
}()
private let facebookImage: UIImageView = {
let imageName = "facebook_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let twitterImage: UIImageView = {
let imageName = "twitter_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let instagramImage: UIImageView = {
let imageName = "instagram_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let linkedinImage: UIImageView = {
let imageName = "linkedin_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let youtubeImage: UIImageView = {
let imageName = "youtube_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let facebookText: UITextView = {
let textView = UITextView()
let attributedText = NSMutableAttributedString(string: "Like us on Facebook", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)])
attributedText.append(NSAttributedString(string: "\n\n\nLorem ipsum Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.gray]))
textView.attributedText = attributedText
textView.textAlignment = .center
textView.isEditable = false
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
// Sets image and text properties
private func setupLayout() {
//Facebook icon constraints
displayImage.translatesAutoresizingMaskIntoConstraints = false
displayImage.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
displayImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
displayImage.widthAnchor.constraint(equalToConstant: 250).isActive = true
displayImage.heightAnchor.constraint(equalToConstant: 250).isActive = true
//Description contraints
displayText.topAnchor.constraint(equalTo: displayImage.bottomAnchor, constant: 120).isActive = true
displayText.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
displayText.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
displayText.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
// Sets control buttons and counter
private func setupControls() {
view.addSubview(nextButton)
view.addSubview(previousButton)
view.addSubview(pageCounter)
//Next button constraints
nextButton.translatesAutoresizingMaskIntoConstraints = false
nextButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
nextButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
nextButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
nextButton.widthAnchor.constraint(equalToConstant: 120).isActive = true
// Next button constraints
previousButton.translatesAutoresizingMaskIntoConstraints = false
previousButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
previousButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
previousButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
previousButton.widthAnchor.constraint(equalToConstant: 120).isActive = true
// Counter contsraints
pageCounter.translatesAutoresizingMaskIntoConstraints = false
pageCounter.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
pageCounter.centerYAnchor.constraint(equalTo: nextButton.centerYAnchor, constant: 0).isActive = true
pageCounter.leadingAnchor.constraint(equalTo: previousButton.trailingAnchor, constant: 5).isActive = true
pageCounter.trailingAnchor.constraint(equalTo: nextButton.leadingAnchor, constant: 5).isActive = true
}
}
我正在尝试创建一组 5 个具有不同图像和文本的引导屏幕。为了使我的代码更清晰,我只需要一个为当前屏幕设置图像的函数。
我当前的功能是这样的:
private let facebookImage: UIImageView = {
let image = #imageLiteral(resourceName: "facebook_icon")
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}()
我希望能够做这样的事情...
private let displayImage: UIImageView = {
let image = currentImage
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
return imageView
}()
我可以将 currentImage
变量更改为在 class:
var twitter : UIImage = #imageLiteral(resourceName: "twitter_icon")
var facebook : UIImage = #imageLiteral(resourceName: "facebook_icon")
var linkedin : UIImage = #imageLiteral(resourceName: "linkedin_icon")
var instagram : UIImage = #imageLiteral(resourceName: "instagram_icon")
var youtube : UIImage = #imageLiteral(resourceName: "youtube_icon")
weak var currentImage : UIImage?
当我收到错误时,我的问题就来了:Instance member 'currentImage' cannot be used on type 'ViewController'
我不明白为什么。我已经查看了其他相关问题,但它们似乎没有帮助。
这里你需要一个函数而不是一个实例属性
func getImgaeV(_ imageName:String) -> UIImageView {
let imageView = UIImageView(image: imageName)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}
有
facebookImage = getImgaeV("facebook_icon")
twitterImage = getImgaeV("twitter_icon")
我认为你们的属性有些相似,所以你可以这样做
var allImageViews = [UIImageView]()
然后里面 viewDidLoad
allImageViews = ["facebook_icon","twitter_icon"].map { getImgaeV([=13=]) }
我不确定这是否是最佳做法,但我基本上初始化了我想更新的图像并使用 else if 语句来更改图像。
import UIKit
class ViewController: UIViewController {
var tapCount : Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.addSubview(displayImage)
view.addSubview(displayText)
setupControls()
setupLayout()
}
// Initalized the display image to facebook icon and is updated when next or previous is tapped
private let displayImage: UIImageView = {
let imageName = "facebook_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}()
private let displayText: UITextView = {
let textView = UITextView()
let attributedText = NSMutableAttributedString(string: "Like us on Facebook", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)])
attributedText.append(NSAttributedString(string: "\n\n\nLorem ipsum Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.gray]))
textView.attributedText = attributedText
textView.textAlignment = .center
textView.isEditable = false
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
private let nextButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("NEXT", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside)
return button
}()
@objc func nextButtonTapped() {
tapCount += 1
pageCounter.currentPage += 1
updatePageContent()
print("NEXT \(tapCount)")
}
@objc func backButtonTapped() {
tapCount -= 1
pageCounter.currentPage -= 1
updatePageContent()
print("PREV \(tapCount)")
}
func updatePageContent() {
if tapCount == -1 {
tapCount = 0
} else if tapCount == 0 {
displayImage.image = facebookImage.image
} else if tapCount == 1 {
displayImage.image = twitterImage.image
} else if tapCount == 2 {
displayImage.image = instagramImage.image
} else if tapCount == 3 {
displayImage.image = linkedinImage.image
} else if tapCount == 4 {
displayImage.image = youtubeImage.image
} else if tapCount == 5 {
tapCount = 4
}
}
private let previousButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("PREV", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return button
}()
private let pageCounter: UIPageControl = {
let control = UIPageControl()
control.currentPage = 0
control.numberOfPages = 5
control.currentPageIndicatorTintColor = .systemBlue
control.pageIndicatorTintColor = .gray
return control
}()
private let facebookImage: UIImageView = {
let imageName = "facebook_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let twitterImage: UIImageView = {
let imageName = "twitter_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let instagramImage: UIImageView = {
let imageName = "instagram_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let linkedinImage: UIImageView = {
let imageName = "linkedin_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let youtubeImage: UIImageView = {
let imageName = "youtube_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let facebookText: UITextView = {
let textView = UITextView()
let attributedText = NSMutableAttributedString(string: "Like us on Facebook", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)])
attributedText.append(NSAttributedString(string: "\n\n\nLorem ipsum Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.gray]))
textView.attributedText = attributedText
textView.textAlignment = .center
textView.isEditable = false
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
// Sets image and text properties
private func setupLayout() {
//Facebook icon constraints
displayImage.translatesAutoresizingMaskIntoConstraints = false
displayImage.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
displayImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
displayImage.widthAnchor.constraint(equalToConstant: 250).isActive = true
displayImage.heightAnchor.constraint(equalToConstant: 250).isActive = true
//Description contraints
displayText.topAnchor.constraint(equalTo: displayImage.bottomAnchor, constant: 120).isActive = true
displayText.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
displayText.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
displayText.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
// Sets control buttons and counter
private func setupControls() {
view.addSubview(nextButton)
view.addSubview(previousButton)
view.addSubview(pageCounter)
//Next button constraints
nextButton.translatesAutoresizingMaskIntoConstraints = false
nextButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
nextButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
nextButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
nextButton.widthAnchor.constraint(equalToConstant: 120).isActive = true
// Next button constraints
previousButton.translatesAutoresizingMaskIntoConstraints = false
previousButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
previousButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
previousButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
previousButton.widthAnchor.constraint(equalToConstant: 120).isActive = true
// Counter contsraints
pageCounter.translatesAutoresizingMaskIntoConstraints = false
pageCounter.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
pageCounter.centerYAnchor.constraint(equalTo: nextButton.centerYAnchor, constant: 0).isActive = true
pageCounter.leadingAnchor.constraint(equalTo: previousButton.trailingAnchor, constant: 5).isActive = true
pageCounter.trailingAnchor.constraint(equalTo: nextButton.leadingAnchor, constant: 5).isActive = true
}
}