Лекция 6 CS193P Winter 2015 — Протоколы и делегирование, распознавание жестов

Пол Хэгерти начинает Лекцию 6 с небольшой демонстрации великолепных возможностей Xcode по работы с пользовательскими UIViews: @IBDesignable и  @IBInspectable. Затем добавляется Модель в MVC, разработка которого началась на прошлой лекции.

Extensions 

Далее рассматривается такая концепция Swift как extensions (расширения). Пол Хэгерти подчеркивает, что рассказывает об extensions не потому, что это очень важная возможность Swift, а потому что это немного опасная возможность Swift. Реализация extensions в Swift очень простая. Совсем чуть-чуть синтаксиса для добавления методов и свойств к существующим classesstructures и enums. Вам не нужно даже иметь код этой вещи, к которой вы хотите добавлять расширения. Вы можете добавлять столько методов и свойств, сколько хотите. Именно простота синтаксиса может привести к злоупотреблениям применения этой концепции.

Протоколы и делегирование

Пол Хэгерти рассказывает о том, что Swift имеет очень любопытный синтаксис для протоколов. Затем следует  подробная теория протоколов и делегирования, излагаемая на слайдах. Четко очерчивается процедура разработки делегирования как со стороны того, кто (обычно View) делегирует свою ответственность другим, так и со стороны того, кто берет на себя роль делегата (по обстоятельствам может быть и View, и Controller). Простота Модели в очень подробном демонстрационном примере приводит к такому понятному изложению сложной для понимания концепции делегирования, что удобно держать этот замечательный пример как прототип для проектирования делегирования в любых других сложных обстоятельствах.

Жесты 

Рассказывается  как нужно работать с самыми разными жестами: pinch (стягивание), pan (движение по экрану), rotation (вращение), swipe  (смахивание), tap (стук) и в разных условиях: на storyboard  и в коде. Большое внимание уделяется как распознаванию различных жестов, так и их обработки как в случае управления экранно-зависимыми элементами UI, так и Моделью.

Демонстрационный пример показывает работу с двумя совершенно различными жестами :  pinch и panОдин — с двумя пальцами, другой — с одним. Один жест мы добавили на storyboard, а другой — в коде. Один обрабатывает наш Controller, а другой —  наш View. Система IOS великолепно определяет разницу между жестами, когда один сменяет другой.

В конце лекции Пол Хэгерти переходит к большой теме «Множество MVC«, которая будет продолжена на Лекции 7.

Лекция и слайды на английском языке iTunes название “6. Protocols and Delegation, Gestures”.  Код Демо «Happiness»  для Swift 1.2 доступен на сайте  Stanford.  Код демонстрационного примера  «Happiness» для Swift 2.0 доступен на Github.

Русский неавторизованный конспект лекции 6, хронометрированный через каждые 5 минут, представлен в PDF — файлах.

Лекция 6 CS193P Winter 2015 iOS 8 1.pdf

Лекция 6 CS193P Winter 2015 iOS 8 2.pdf

Лекция 6 CS193P Winter 2015 iOS 8 3.pdf

Лекция 6 CS193P Winter 2015 — Протоколы и делегирование, распознавание жестов: 5 комментариев

  1. Добрый день! Делая демо «Happiness» решил добавить смайлику заливку желтого цвета. Для этого в функции drawRect присвоил новый цвет свойству «color», вызвал color.setFill() и facePath.fill(). В симуляторе сначала все отображается нормально, но как только я «касаюсь» экрана, заливка выходит на передний план и перекрывает глаза и рот. Подскажите, пожалуйста, как можно решить эту накладку. Заранее благодарю 🙂

    Вот как это выглядит
    http://s019.radikal.ru/i624/1602/74/3afb35c1b39f.png
    http://s50.radikal.ru/i128/1602/da/d0f554fd57a6.png
    http://s50.radikal.ru/i128/1602/da/d0f554fd57a6.png

    • Добавила цвет для закрашивания
      @IBInspectable
      var colorFill: UIColor = UIColor.yellowColor() { didSet { setNeedsDisplay() } }

      и drawRect выглядит так:
      override func drawRect(rect: CGRect)
      {
      let facePath = UIBezierPath(
      arcCenter: faceCenter,
      radius: faceRadius,
      startAngle: 0,
      endAngle: CGFloat(2*M_PI),
      clockwise: true
      )
      facePath.lineWidth = lineWidth
      colorFill.setFill()
      facePath.fill()
      color.set()
      facePath.stroke()
      bezierPathForEye(.Left).stroke()
      bezierPathForEye(.Right).stroke()
      // get the smiliness from our dataSource delegate
      // smiliness will default to zero if either the dataSource is nil or the dataSource returns nil
      let smiliness = dataSource?.smilinessForFaceView(self) ?? 0.0
      let smilePath = bezierPathForSmile(smiliness)
      smilePath.stroke()
      }

      Все работает.

  2. Супер! Действительно работает, значит нужно было задать colorFill отдельно, буду знать, благодарю!!

Обсуждение закрыто.