【问题标题】:iOS custom view doesn't show image immediatelyiOS自定义视图不会立即显示图像
【发布时间】:2018-01-17 15:43:42
【问题描述】:

我在 Swift 中制作了一个简单的自定义视图,它有一个背景图像视图,前面有一张照片和一些标签。然后我将自定义视图添加到我的情节提要中,它显示良好,我可以看到背景图像和标签。

但是当我在我的设备上运行我的应用程序时,图像视图不会立即显示,如果我导航到另一个视图然后返回,它会显示。我只有一个计时器,它在我的场景中安排了一些后台任务。我错过了什么吗?

这是我的自定义视图的代码

import UIKit

@IBDesignable class GaugeView: UIImageView {

    @IBOutlet weak var speedLabel: UILabel!

    let circlePathLayer = CAShapeLayer()
    var circleRadius: CGFloat = 50.0

    var speed: CGFloat {
        get {
            return circlePathLayer.strokeEnd
        }
        set {
            speedLabel.text = String(format: "%.2f", newValue)

            if newValue < 20.0 {
                circlePathLayer.strokeColor = UIColor.blueColor().CGColor
            } else if newValue >= 25.0 {
                circlePathLayer.strokeColor = UIColor.redColor().CGColor
            } else {
                circlePathLayer.strokeColor = UIColor.yellowColor().CGColor
            }

            if (newValue > 50) {
                circlePathLayer.strokeEnd = 1
            } else if (newValue < 0) {
                circlePathLayer.strokeEnd = 0
            } else {
                circlePathLayer.strokeEnd = newValue / 49.9
            }
        }
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        xibSetup()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        xibSetup()
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        circleRadius = bounds.width / 2 - 2.6
        circlePathLayer.frame = bounds
        circlePathLayer.path = circlePath().CGPath
    }

    // Our custom view from the XIB file
    var view: UIView!
    let nibName = "GaugeView"

    func xibSetup() {
        view = loadViewFromNib()
        // use bounds not frame or it'll be offset
        view.frame = bounds
        // Make the view stretch with containing view
        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
        // Adding custom subview on top of our view (over any custom drawing > see note below)
        addSubview(view)
        // Configure speed circle layer
        configure()
    }

    func configure() {
        speed = 0.0
        circlePathLayer.frame = bounds
        circlePathLayer.lineWidth = 6
        circlePathLayer.fillColor = UIColor.clearColor().CGColor
        circlePathLayer.strokeColor = UIColor.blueColor().CGColor
        layer.addSublayer(circlePathLayer)
        backgroundColor = UIColor.whiteColor()
    }

    func circleFrame() -> CGRect {
        var circleFrame = CGRect(x: 0, y: 0, width: 2*circleRadius, height: 2*circleRadius)
        circleFrame.origin.x = CGRectGetMidX(circlePathLayer.bounds) - CGRectGetMidX(circleFrame)
        circleFrame.origin.y = CGRectGetMidY(circlePathLayer.bounds) - CGRectGetMidY(circleFrame)
        return circleFrame
    }

    func circlePath() -> UIBezierPath {
        let center: CGPoint = CGPointMake(CGRectGetMidX(circlePathLayer.bounds), CGRectGetMidY(circlePathLayer.bounds))
        let start = CGFloat(1.33 * M_PI_2)
        let end = CGFloat( 1.64 * M_2_PI)
        return UIBezierPath(arcCenter: center, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)
    }

    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }

}

然后我将自定义视图添加到我的故事板中,并使用 performSegueWithIdentifier("dashboardSegue", sender: nil) 以编程方式导航到场景。我刚刚注意到不仅客户视图,而且场景中的两个进度条也没有显示。

【问题讨论】:

  • 我们可以看看一些代码吗?
  • 不知道为什么,但是我删除了场景导航代码 performSegueWithIdentifier("dashboardSegue", sender: nil),使用 segue 直接显示视图,我的第二个视图完全显示没有延迟。

标签: ios swift


【解决方案1】:

最好显示您的代码,但我猜您的计时器卡住了主 UI 线程。当您导航到另一个视图时,您的 timer.invalidate() 被调用。尝试删除NSTimer,看看它是否正常工作。

【讨论】:

  • 这可能是原因,我将尝试在新线程中启动计时器,看看会发生什么。如果这不起作用,我会回来提供更多细节。谢谢。
  • 我将计时器添加到运行循环中,但不起作用。我注释掉了 viewDidLoad 和 viewWillApper 中的所有代码,但仍然不起作用。如果我将场景设置为初始视图,那么它会很快显示。知道区别吗?
  • 如果是这样,我猜你的视图可能不是从情节提要开始的。您可以尝试以编程方式添加您的视图吗?或者如果你可以在 github 上分享你的代码。
猜你喜欢
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多