Swift / UIView / drawrect - как получить drawrect для обновления при необходимости
Я новичок в изучении 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")
}
}
(Примечание: журнал обновляется каждый раз, когда я нажимаю на кнопку, так что это не проблема. Просто дисплей никогда не меняется. Кроме того, я попытался нарисовать прямоугольник со случайными координатами, так что это не то, что он обновляется, но я его не вижу.)
Спасибо за любую помощь!
2 ответов
во-первых, вам нужно указать назначенный инициализатор для UIView (init with 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")
}
}
вы вызываете setNeedsDisplay локальный экземпляр test_view, созданный в функции Press_Button, а не один в Вас UIViewController (который вам нужно сделать, кстати, создание его в качестве локальной переменной в ViewDidLoad вам не поможет). Вы можете создать его как @IBOutlet, а затем использовать interface builder для определения экземпляра для присоединения к этой переменной-UIViewController выглядит следующим образом:
class ViewController: UIViewController {
@IBOutlet weak var instruction: UILabel?
@IBOutlet weak var f: Test_View?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func Button_Pressed(sender: AnyObject) {
f.setNeedsDisplay()
NSLog("Button pressed.")
}
...