override func drawRect(rect: CGRect) {
orign = graphCenter
axesDrawer.contentScaleFactor = contentScaleFactor
axesDrawer.drawAxesInRect(bounds, origin: orign!, pointsPerUnit: scale)
}
Привет
СМОТРИТЕ в моем репозитарии ваше Задание 3 с добавлениями https://github.com/BestKora/Calculator3ForIlya
Затем делаете установку ограничений с помощью самой правой кнопки в нижнем правом углу:
var yForX: (( x: Double) -> Double?)? { didSet {setNeedsDisplay() } }
и будем ее использовать в методе drawCurveInRect.
Логика этого метода очень простая и описана она в Задании 3 подсказке № 13
" Не переусложните ваш drawRect. Просто делайте итерации по каждой пикселе (pixel) (не point) по всей ширине (width) вашего View, и рисуйте линию (или просто перемещайтесь, если последняя точка была “неправильной”) к следующей “правильной” точке."
Ширина нашего View - bounds.size.width в точках (points),а нам сказали итерировать по пикселям, следовательно мы должны умножить на contentScaleFactor, который содержит количество пикселей на одну точку в зависимости от разрешения дисплея вашего прибора (1- обычный 2 - Retina, 3- iPhone 6+)
Поэтому общее количество итераций (или пикселей) будет bounds.size.width*contentScaleFactor.
var point = CGPoint()
for i in 0...Int(bounds.size.width * contentScaleFactor){
point.x = CGFloat(i) / contentScaleFactor
А рисовать мы должны в точках (points), поэтому переводим полученное значение i в х-координату точки, разделив на contentScaleFactor и опять возвращаясь в пространство точек. Понятно, что чем больше разрешение дисплея прибора, тем больше мы будем делать расчетов, но графики всегда строятся в точках (points).
Теперь нам нужно получить у, имея функцию yForX:, где на входе Double и есть смещение по оси х: origin.x и масштаб scale, поэтому в функцию yForX: пойдет такая координата х:
Double ((point.x - origin.x) / scale)
Получаем Double координату Y с помощью функции yForX:
if let y = (self.yForX)?(x: Double ((point.x - origin.x) / scale)) {
point.y = origin.y - CGFloat(y) * scale
path.addLineToPoint(point)
Либо просто перемещаемая в нее, не проводя линию
path.moveToPoint(point)
Я вставила в ваш код функцию drawCurveInRect и обеспечила передачу замыкания в GraphView - посмотрите как. Больше ничего не трогала.
Но у вас проблема с расчетом program в CalculatorBrain.
Если я задаю нарисовать функцию M, то отладочная печать должна давать
х = 1 у = 1
х = 2 у = 2
и т.д.
У вас везде 0:
СМОТРИТЕ в моем репозитарии ваше Задание 3 с добавлениями
https://github.com/BestKora/Calculator3ForIlya
var variableValues: Dictionary<String, Double> = [:] {
didSet {
// если мы меняем "переменные", то перезапускаем program
program = internalProgram
}
}
//orign = graphCenter
orign = orign ?? graphCenter--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/rEBgaclfjfU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/be4d037a-9534-4eb9-b9c4-d444fde23fb4%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
private var setOrigin: CGPoint? { didSet { setNeedsDisplay() } }
var origin: CGPoint {
get {
return setOrigin ?? CGPoint(x: bounds.midX, y: bounds.midY)
}
set {
setOrigin = newValue
}
}
override func drawRect(rect: CGRect) {
axesDrawer.contentScaleFactor = contentScaleFactor
axesDrawer.drawAxesInRect(bounds, origin: origin, pointsPerUnit: scale)
drawCurveInRect(bounds, origin: origin, pointsPerUnit: scale)
}
Все работает с таким предложение, можно посмотреть код для Задания iOS 8 здесь.
То, что предлагаете вы:
origin = graphCenter
--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/rEBgaclfjfU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/d0e329c9-0b0b-48f6-86c2-75020dbb0df3%40googlegroups.com.
Привет
Графический View не должен владеть (то есть запоминать) данные, представляемые графически, даже временно. Он должен запрашивать данные, если это необходимо. Ваш графический view должен строить график функции y(x), он не должен графически отображать массив точек, не передавайте ему массив точек.
Как вы будете выполнять этот пункт? Есть только два способа у View запрашивать данные: делегирование и замыкания. Делегирование в разделе things to learn из Задания 3 iOS 9 он действительно исключил, наверно, предполагая, что вы должны сделать упор на замыкание. Кстати в Лекции 7 он говорит о том, что обычно он все объясняет на лекциях и только потом дает задание, но на лекции 7 он сказал, что это не получилось с Заданием 3 и стоит рассмотреть использование замыканий в Задании 3 вместо делегирования.
Что касается NSUserDefaults, то это дополнительный пункт 2:
Сохраните origin и scale между запусками вашего приложения. Где это следует сделать, оказывая наибольшее уважение MVC, как вы думаете? Нет однозначно “правильного ответа” на этот вопрос. Это требует некоторой утонченности знания MVC.Не указывая NSUserDefaults, он дает вам свободу для решения этого пункта, но я не вижу другого способа, кроме как NSUserDefaults или сохранить в файле или базе данных Core Data. Но ни Core Data, ни Persistance он еще не читал. Может быть он надеется на некоторое неординарное решение? Надо сказать, что раньше в Заданиях было больше подсказок (например iOS 8), поэтому, если задания похоже, то иногда можно заглянуть и в старое Задание;