То, что вы сделали, это непосредственно для рисования одной линии. Вы используете первое касание в своих методах touch
, а также у вас есть только одна «текущая строка».
Я бы пошел с чем-то вроде следующего. Я надеюсь, что код говорит сам за себя:
class Line {
var start: CGPoint = .zero
var end: CGPoint = .zero
}
private var finishedLines: [Line] = [Line]()
private var currentLines: [UITouch: Line] = [UITouch: Line]()
private func insertNewPoint(_ point: CGPoint, forTouch touch: UITouch) {
if let line = currentLines[touch] {
line.end = point
} else {
currentLines[touch] = {
let newLine = Line()
newLine.start = point
return newLine
}()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
touches.forEach { touch in
insertNewPoint(touch.location(in: self.view), forTouch: touch)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
touches.forEach { touch in
insertNewPoint(touch.location(in: self.view), forTouch: touch)
}
}
private func finishLine(at point: CGPoint, forTouch touch: UITouch) {
guard let line = currentLines[touch] else { return }
currentLines[touch] = nil
line.end = point
self.finishedLines.append(line)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
touches.forEach { touch in
finishLine(at: touch.location(in: self.view), forTouch: touch)
}
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
touches.forEach { touch in
finishLine(at: touch.location(in: self.view), forTouch: touch)
}
}
Так что, где вы обрабатываете прикосновения, наиболее важно перебрать все из них touches.forEach { touch in
. И вам нужен набор строк, которые в вашем случае должны быть назначены на штрихи. Он должен работать с использованием словаря [UITouch: Line]
.
Полный пример:
import UIKit
class ViewController: UIViewController {
private var finishedLines: [Line] = [Line]()
private var currentLines: [UITouch: Line] = [UITouch: Line]()
private var lineView: LineView?
override func viewDidLoad() {
super.viewDidLoad()
self.view.isMultipleTouchEnabled = true
self.lineView = {
let view = LineView(frame: self.view.bounds)
view.isUserInteractionEnabled = false
self.view.addSubview(view)
return view
}()
}
private func updateDrawing() {
lineView?.lines = finishedLines + currentLines.map { [111].value }
lineView?.setNeedsDisplay()
}
private func insertNewPoint(_ point: CGPoint, forTouch touch: UITouch) {
if let line = currentLines[touch] {
line.end = point
} else {
currentLines[touch] = {
let newLine = Line()
newLine.start = point
return newLine
}()
}
updateDrawing()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
touches.forEach { touch in
insertNewPoint(touch.location(in: self.view), forTouch: touch)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
touches.forEach { touch in
insertNewPoint(touch.location(in: self.view), forTouch: touch)
}
}
private func finishLine(at point: CGPoint, forTouch touch: UITouch) {
guard let line = currentLines[touch] else { return }
currentLines[touch] = nil
line.end = point
self.finishedLines.append(line)
updateDrawing()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
touches.forEach { touch in
finishLine(at: touch.location(in: self.view), forTouch: touch)
}
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
touches.forEach { touch in
finishLine(at: touch.location(in: self.view), forTouch: touch)
}
}
}
// MARK: - Line
extension ViewController {
class Line {
var start: CGPoint?
var end: CGPoint?
}
}
// MARK: - LineView
extension ViewController {
class LineView: UIView {
var lines: [Line]?
override func draw(_ rect: CGRect) {
super.draw(rect)
// Fill white background
UIColor.white.setFill()
UIBezierPath(rect: rect).fill()
// Draw all lines
UIColor.red.setStroke()
lines?.forEach { line in
if let start = line.start, let end = line.end {
let path = UIBezierPath()
path.move(to: start)
path.addLine(to: end)
path.stroke()
}
}
}
}
}
Вы можете вставить этот код во вновь созданный проект Xcode iOS в свой ViewController
, и он должен работать.
Да, главным образом. Некоторые реализации крона имеют поддержку в течение многих лет, некоторые не делают, таким образом, мы предположим, что Ваш не делает. Кроме того, я делаю предположение, что это задание только выполняется демоном крона, таким образом, мы можем использовать выполнить бит, чтобы определить, должен ли крон выполнить задание.
Обратите внимание, что необходимо будет оставить сценарий как неисполняемый файл до тех пор, пока Вы хотите, чтобы он работал.
Следующие выражения крона сделают то, что Вы хотите (каждый день, включая выходные). Тонкая настройка, поскольку Вы должны:
# Make the job executable on 29 June.
0 6 29 6 * chmod +x /path/to/my/job/script
# Run the job between June and December, only if it's executable.
0 7 * 6-12 * test -x /path/to/my/job/script && /path/to/my/job/script
# Disable execution after 30 December.
0 8 30 12 * chmod -x /path/to/my/job/script
Можно использовать это для генерации crontab, который работает в определенных интервалах:
http://www.robertplank.com/cron/
Или это
http://www.webmaster-toolkit.com/cron-generator.shtml
Одно решение состояло бы в том, чтобы установить 6 кронов, 1 в течение каждого месяца, каждый будет работать в 7:00 каждый день в том месяце.
Это - вероятно, самый легкий путь, следующий должен был бы написать сценарий его.
Это может быть сделано в хитром виде пути.
Вам нужны три отдельных cron
задания для того диапазона, все выполняющие тот же код (X
в этом случае):
"0 7 29,30 6 * X"
)."0 7 * 7-11 * X"
)."0 7 1-30 12 * X"
).Это дает Вам:
# Min Hr DayOfMonth Month DayOfWeek Command
# --- -- ---------- ----- --------- -------
0 7 29,30 6 * X
0 7 * 7-11 * X
0 7 1-30 12 * X
Затем удостоверьтесь, что Вы комментируете их, до 29 июня 2010 приходит. Можно добавить финал cron
задание 31 декабря, чтобы послать Вам по электронной почте, что это должно быть отключено.
Или Вы могли изменить X
сразу выйти, если год не является 2009.
if [[ "$(date +%Y)" != "2009" ]] ; then
exit
fi
Затем не будет иметь значения, если Вы забудете отключать задания.
Я обычно фанат сохранения логики при запуске программы. Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В этом скрипте вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.
Если ваша работа - бинарная программа, вы можете настроить скрипт run_script, который выполняет эту фильтрацию расписания перед вызовом программы. .
Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В этом скрипте вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.Если ваша работа - бинарная программа, вы можете настроить скрипт run_script, который выполняет эту фильтрацию расписания перед вызовом программы. .
Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В этом скрипте вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.Если ваша работа - бинарная программа, вы можете настроить скрипт run_script, который выполняет эту фильтрацию расписания перед вызовом программы. .
Нет, afaik, Вы не можете сделать этого.
Поля крона содержат значения в течение многих минут, часов, дня месяца, месяца и дня недели, соответственно.
10 5 10 * * means run at 5:10 on every 10th of every month.
10 5 * 12 * means run at 5:10 on every day in december
10 5 * * 1 means run at 5:10 every Monday
Можно заставить его работать на ряде определенных месяцев, поскольку crontab формат действительно принимает диапазоны. С апреля по декабрь был бы 4-12 в этом случае для поля месяца. Но это не принимает во внимание Ваше желание того, чтобы ограничить это 2009.
Нет никакого механизма для установки, запускают и останавливают даты cronjob. Можно всегда писать сценарий этого, конечно. Сделайте cronjob выполняемым каждый день и проверьте текущую дату, чтобы быть прежде 30/12. Если это - 31/12, заставляют его удалить себя. Или что-то более продуманное.
crontab
0 7 * * 6-12 command_X
сделал бы то, что Вы хотите частично, но это запустилось бы 1-го июня и пробежало бы 31-го декабря. Пропуск первой части июня и 31-го декабря должен был бы быть задан сценарием в этих X командах.