当前位置: 首页 > 面试题库 >

Swift / UIView / drawrect-如何在需要时更新drawrect

邰钟展
2023-03-14
问题内容

我是学习Swift的新手,并且正在尝试运行一个非常简单的应用程序。我要做的就是 让UIView.drawRect在我按下按钮时更新
。无论我尝试什么,它都会在应用程序首次加载时更新/绘制,然后再更新/绘制。我已经为此奋斗了几天,但我找不到任何帮助。

我创建:

  • 单视图应用程序

  • 一个按钮,作为操作链接到视图控制

  • 一个新的类Test_View继承了UIView

ViewController代码:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        var f = Test_View()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func Button_Pressed(sender: AnyObject) {
        var f = Test_View()
        f.setNeedsDisplay()
        NSLog("Button pressed.")
    }

}

Test_View代码:

class Test_View: UIView {

    override func drawRect(rect: CGRect) {
        let h = rect.height
        let w = rect.width
        var color:UIColor = UIColor.yellowColor()

        var drect = CGRect(x: (w * 0.25),y: (h * 0.25),width: (w * 0.5),height: (h * 0.5))
        var bpath:UIBezierPath = UIBezierPath(rect: drect)

        color.set()
        bpath.stroke()

        NSLog("drawRect has updated the view")

    }

}

(注意:每次按下按钮,日志都会更新,这不是问题。只是显示永远不会改变。而且,我尝试绘制带有随机坐标的矩形,因此不是更新,而是我没看到。)

谢谢你的帮助!


问题答案:

首先,您需要为UIView指定一个指定的初始化程序(以frame初始化)。然后将您的对象f设为类的常量或变量(取决于您的需要),以便可以在项目范围内对其进行访问。另外,您必须将其添加为视图的子视图。看起来像这样:

import UIKit

class ViewController: UIViewController {
    let f = Test_View(frame: CGRectMake(0, 0, 50, 50))

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(f)
    }

    @IBAction func buttonPressed(sender: UIButton) {
        f.setNeedsDisplay()
    }
}

class Test_View: UIView {

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

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

    override func draw(_ rect: CGRect) {
        let h = rect.height
        let w = rect.width
        let color:UIColor = UIColor.yellow

        let drect = CGRect(x: (w * 0.25),y: (h * 0.25),width: (w * 0.5),height: (h * 0.5))
        let bpath:UIBezierPath = UIBezierPath(rect: drect)

        color.set()
        bpath.stroke()

        NSLog("drawRect has updated the view")

    }

}


 类似资料:
  • 我使用struts2和hibernate创建了一个应用程序,该应用程序将excel文件上传到数据库中,并执行其他CRUD操作。然而,现在出现了一个更改要求,用户应该能够从UI控制数据库模式,这意味着每当excel文件在数据库中有新列时,用户应该能够通过用户界面动态添加新列。 我不知道如何才能做到这一点,因为更新数据库仍将保持实体类不变。 为了说明这个问题,请考虑以下情况:我有一个员工的ab exc

  • 问题内容: 在回答这个问题时,谈到要调用时需要参数标签。这在Swift中很正常。 但是,陌生力量在起作用: 要在此处使用参数标签,必须明确声明。 在文档中,我还没有看到非常详尽的解释。哪些种类的类/实例/全局函数需要自变量标签?是否始终使用参数标签导出和导入Obj-C方法? 问题答案: 从Swift 3.0开始,这种情况再次发生了变化:除非您使用外部名称明确选择退出,否则所有方法,函数和初始化器都

  • 我是实体框架的新手,所以如果这看起来很傻,请原谅我。 请考虑以下 json 对象: 让我们假设我们将其作为请求正文发送,以便在数据库中更新它。它是具有子实体的用户,如下所示: 现在,问题来了。虽然我希望用户能够创建一个新帐户(或联系人)或更新现有帐户(就像现在发生的那样),但我不希望规范发生同样的事情。用户只能添加或删除规范,无权创建新规范或更改规范的属性。 配置这种行为的正确方法是什么? 以下代

  • 需要在 SQL 中将主键列更新为自动递增 我越来越不犯错, 关键字“身份”附近的语法不正确。

  • 我正在努力改进我写的一个数据传输程序。我在寻找如何让它更快的建议。我的程序通过填充ResultSet并将结果写入文件来从数据库(通常是Oracle11g)中提取数据。该程序定期查看表,并查询某个特殊列是否发生了更改。例如,这可能是这样一个查询:

  • 我知道自动布局链基本上由3个不同的过程组成。 更新约束 布局视图(这里是我们计算框架的地方) 显示 我并不完全清楚的是 和 之间的内在区别。来自苹果文档: 设置需要布局 当您想要调整视图子视图的布局时,请在应用程序的主线程上调用此方法。此方法记下请求并立即返回。由于此方法不会强制立即更新,而是等待下一个更新周期,因此您可以使用它来使多个视图的布局失效,然后再更新这些视图中的任何一个。此行为允许您将