【问题标题】:SF Symbols not loading into UIImageViewSF 符号未加载到 UIImageView
【发布时间】:2020-08-21 20:52:37
【问题描述】:

我正在创建一个用于跟踪健康信息的应用程序,我想使用 SF Symbols 中的两个箭头图像。不幸的是,无论我尝试什么,这些符号都不会出现。 我已经使用 Assets 文件夹中的图像测试了代码,这在我创建的 UIImageViews 中似乎没有问题。只有当我尝试使用 UIImage(systemName: ) 时才会遇到问题。

        self.calendarView = UIView(frame: CGRect(x: 0, y: self.getCurrentY(), width: UIScreen.main.bounds.width, height: 60))
        self.calendarView?.backgroundColor = .white
        self.calendarView?.layer.borderColor = UIColor.black.cgColor
        self.calendarView?.layer.borderWidth = 1

        self.currentDate = UILabel(frame: CGRect(x: self.calendarView!.bounds.width / 4, y: self.calendarView!.bounds.height / 2 - 20, width: self.calendarView!.bounds.width / 2, height: 40))
        self.currentDate!.text = "5/6/20"
        self.currentDate!.textColor = .black
        self.currentDate!.layer.borderColor = UIColor.black.cgColor
        self.currentDate?.layer.borderWidth = 1
        self.currentDate?.textAlignment = .center
        self.calendarView?.addSubview(currentDate!)

        //let testImage = UIImage(named: "logotest.jpg")!
        let image1 = UIImage(systemName: "arrow.left")!.withTintColor(.blue)
        let image2 = UIImage(systemName: "arrow.right")!.withTintColor(.blue)

        self.leftArrow = UIImageView(image: image1)
        self.rightArrow = UIImageView(image: image2)

        self.leftArrow?.frame = CGRect(x: 10, y: 10, width: 40, height: 40)
        self.rightArrow?.frame = CGRect(x: UIScreen.main.bounds.width - 50, y: 10, width: 40, height: 40)

        self.leftArrow?.layer.borderWidth = 1
        self.rightArrow?.layer.borderWidth = 1

        self.calendarView!.addSubview(self.leftArrow!)
        self.calendarView!.addSubview(self.rightArrow!)
        self.contentView.addSubview(self.calendarView!)

更奇怪的是,当我进入断点时,图像实际上显示了!我也附上了这张照片。对此我能得到的任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 你的代码够用了……self.contentView的frame是什么?
  • self.calendarView 的框架是什么?我猜他们会超出框架
  • @jawadAli 这是有道理的。 CalendarView 和 contentView(一个 UIScrollView)正在显示,它是 UIImages 没有。我刚刚附上了屏幕的图片,UIImageViews 显示在屏幕的左上角和右上角
  • self.getCurrentY() 总结了添加到 contentView 的视图的大小,因此它知道在滚动视图中添加下一个视图的位置,但知道它的相关性如何
  • @jawadAli 这对我有用,谢谢!!!

标签: ios swift xcode uiimageview sf-symbols


【解决方案1】:

给你的 imageViews 着色将解决问题

leftArrow.tintColor = .blue 
leftArrow.tintColor = .blue

【讨论】:

    【解决方案2】:

    1) 您应该使用约束/自动布局而不是显式框架。

    2) 你应该使用if letguard let 来避免所有那些!?

    试试这样:

    class ViewController: UIViewController {
    
        var leftArrow: UIImageView!
        var rightArrow: UIImageView!
        var calendarView: UIView!
        var currentDate: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //self.calendarView = UIView(frame: CGRect(x: 0, y: self.getCurrentY(), width: UIScreen.main.bounds.width, height: 60))
            self.calendarView = UIView()
            self.calendarView.backgroundColor = .white
            self.calendarView.layer.borderColor = UIColor.black.cgColor
            self.calendarView.layer.borderWidth = 1
    
            //self.currentDate = UILabel(frame: CGRect(x: self.calendarView!.bounds.width / 4, y: self.calendarView!.bounds.height / 2 - 20, width: self.calendarView!.bounds.width / 2, height: 40))
            self.currentDate = UILabel()
            self.currentDate.text = "5/6/20"
            self.currentDate.textColor = .black
            self.currentDate.layer.borderColor = UIColor.black.cgColor
            self.currentDate.layer.borderWidth = 1
            self.currentDate.textAlignment = .center
    
            //let testImage = UIImage(named: "logotest.jpg")!
            guard let imgLeft = UIImage(systemName: "arrow.left"),
                let imgRight = UIImage(systemName: "arrow.right") else {
                    fatalError("Could not create arrow images!")
            }
    
            let image1 = imgLeft.withTintColor(.blue)
            let image2 = imgRight.withTintColor(.blue)
    
            self.leftArrow = UIImageView(image: image1)
            self.rightArrow = UIImageView(image: image2)
    
            //self.leftArrow.frame = CGRect(x: 10, y: 10, width: 40, height: 40)
            //self.rightArrow.frame = CGRect(x: UIScreen.main.bounds.width - 50, y: 10, width: 40, height: 40)
    
            self.leftArrow.layer.borderWidth = 1
            self.rightArrow.layer.borderWidth = 1
    
            self.calendarView.addSubview(currentDate)
            self.calendarView.addSubview(self.leftArrow)
            self.calendarView.addSubview(self.rightArrow)
    
            //self.contentView.addSubview(self.calendarView)
            self.view.addSubview(self.calendarView)
    
            [calendarView, currentDate, leftArrow, rightArrow].forEach {
                $0?.translatesAutoresizingMaskIntoConstraints = false
            }
    
            // respect safe area
            let g = view.safeAreaLayoutGuide
    
            NSLayoutConstraint.activate([
    
                // calendarView to view (safe area) Top / Leading / Trailing
                //  Height: 60
                calendarView.topAnchor.constraint(equalTo: g.topAnchor, constant: 0.0),
                calendarView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 0.0),
                calendarView.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: 0.0),
                calendarView.heightAnchor.constraint(equalToConstant: 60.0),
    
                // currentDate label to calendarView centerX & centerY
                //  Width: 1/2 of calendarView width
                //  Height: 40
                currentDate.centerXAnchor.constraint(equalTo: calendarView.centerXAnchor),
                currentDate.centerYAnchor.constraint(equalTo: calendarView.centerYAnchor),
                currentDate.heightAnchor.constraint(equalToConstant: 40.0),
                currentDate.widthAnchor.constraint(equalTo: calendarView.widthAnchor, multiplier: 0.5),
    
                // leftArrow to calendarView Leading: 10 Width: 40 Height: 40 centerY
                leftArrow.leadingAnchor.constraint(equalTo: calendarView.leadingAnchor, constant: 10.0),
                leftArrow.widthAnchor.constraint(equalToConstant: 40.0),
                leftArrow.heightAnchor.constraint(equalToConstant: 40.0),
                leftArrow.centerYAnchor.constraint(equalTo: calendarView.centerYAnchor),
    
                // rightArrow to calendarView Trailing: -10 Width: 40 Height: 40 centerY
                rightArrow.trailingAnchor.constraint(equalTo: calendarView.trailingAnchor, constant: -10.0),
                rightArrow.widthAnchor.constraint(equalToConstant: 40.0),
                rightArrow.heightAnchor.constraint(equalToConstant: 40.0),
                rightArrow.centerYAnchor.constraint(equalTo: calendarView.centerYAnchor),
    
            ])
    
        }
    }
    

    输出:

    并且,通过自动布局和约束,它可以在需要时自动调整大小 - 例如在设备旋转时:

    【讨论】:

    • 我认为他给了他的窗口色调.white ..这就是他的图标不可见的原因......
    • 尝试将窗口色调设置为白色,然后查看输出...
    • @jawadAli - OP 发布的代码显示:let image1 = UIImage(systemName: "arrow.left")!.withTintColor(.blue) ...我将其分开以摆脱强制展开,并且在运行我发布的示例代码时箭头显示正常.
    • @DonMag3 在您的 AppDelegate 或 SceneDelegate 中写下这一行 .... 无论您使用什么... window?.tintColor = .white 然后运行您的代码 ...
    • @jawadAli - 嗯,嗯,是的,这是一个非常关键的信息,可以省略。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2021-01-05
    • 2023-03-18
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多