CS193P 2016. Лекция 5

25 views
Skip to first unread message

Ilya Dolgopolov

unread,
Jun 11, 2016, 12:54:07 PM6/11/16
to Swift [ru]
В 5-й лекции где-то на 23-24 минуте Пол объясняет почему didSet не сработает для переменной-модели. Т.к. она с начала должна полностью быть проинициализирована, т.е. она еще не создана, чтоб триггер срабатывал (в данном случае обозреватели это аналог триггеров в БД). В качестве решения он реализует обозреватель для view. и вот тут вопрос: я правильно понимаю, что наш outlet это еще одна ссылка, а сама инициализация класса проходит где-то внутри?
В этом смысле в Swift не очень удобно, т.к. мы что-то делаем в xcode и это не дублируется в виде кода, как это сделано для c#, когда добавление к примеру кнопки, отражено создание соответствующего объекта в дизайнере и тп

tatiana.kornilova

unread,
Jun 13, 2016, 2:44:13 AM6/13/16
to Swift [ru]
Очень интересный вопрос.
Нужно понять, что при создании приложения iOS с помощью storyboard всем рулит не код, написанный вами, а storyboard, в которой размещаются весь UI, включая и связи (segue) между экранными фрагментами. Ваш код лишь дополняет и делает пользовательские настройки того, что находится на  storyboard. Вы пишите класс FaceViewController для того, чтобы управлять  экранным фрагментом (например, Face View Controller) на storyboard, в котором вы можете размещать что хотите. Этот экранный фрагмент, практически всегда, обслуживается определенным классом (FaceViewController). Для того, чтобы дать возможность программисту общаться с элементами, расположенным на storyboard в конкретном экранном фрагменте,  вам выводится (с помощью CTRL-перетягивания) outlet (что в переводе означает "розетка" наподобие электрической розетки) и Action
Вот в пределах этого и крутитесь. Добавляйте переменные, методы, классы, структуры. А "розеткой"  outlet будет управлять система, когда будет активизировать storyboard  при запуске вашего приложения. Вы можете вмешиваться в процесс создания и функционирования вашего экранного фрагмента с помощью так называемых методов "жизненного цикла" View Controller, но не об этом сейчас речь. Речь об инициализации. Так вот установке "розетке"  outlet не мешает незавершенная инициализация класса, так как она устанавливается системой в определенный момент.

суббота, 11 июня 2016 г., 19:54:07 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jun 14, 2016, 1:46:06 PM6/14/16
to Swift [ru]

Еще вопрос ну или заметка, интересно работает pinch, проверял с помощью print переменных, раскоментировав

        case .Changed,.Ended:

            //print("recognizer.scale = \(recognizer.scale) scale \(scale)")

            scale *= recognizer.scale

            recognizer.scale = 1.0


процесс умножения выполнялся рекурсивно до момента пока я не отпустил pinch-жест, те пальцы, а уже затем выполнилось присвоение:
recognizer.scale = 1.0

recognizer.scale = 0.987367281839183 scale 0.8

recognizer.scale = 1.0 scale 0.789893825471346

recognizer.scale = 0.991954185789392 scale 0.789893825471346

recognizer.scale = 0.993124766907839 scale 0.783538486505498

recognizer.scale = 0.993078565666879 scale 0.778151476774094

recognizer.scale = 0.996515865033635 scale 0.77276555242638

recognizer.scale = 0.989513218576925 scale 0.770073132944369

recognizer.scale = 0.991663687312069 scale 0.761997544319399

recognizer.scale = 0.992869986500363 scale 0.755645294522517

recognizer.scale = 0.992820342300422 scale 0.750257533371635

recognizer.scale = 0.992770103365261 scale 0.744870941095497

recognizer.scale = 0.991422213952615 scale 0.739485601185156

recognizer.scale = 0.992648293093454 scale 0.733142451913067

recognizer.scale = 0.992595566081656 scale 0.727752603485856

recognizer.scale = 0.992542065163483 scale 0.722364007424442

recognizer.scale = 1.0 scale 0.716976663728825


вот тут мне логика не понятна работы хандлера жеста: каждый раз когда я раздвигаю или сдвигаю пальца идет умножение и это происходи 20-30 раз, пальцы отпускаю выполняется следующий код, те присвоение: recognizer.scale = 1.0
я думал метод выполняется каждый раз по пиксельно, не понятен алгоритм как так получается, что постоянно выполняется команда scale *= recognizer.scale а не весь метод до конца 

сумбурно как-то объяснил (( просто на лице цикл, а в коде его нет ((((

tatiana.kornilova

unread,
Jun 14, 2016, 2:58:52 PM6/14/16
to Swift [ru]
Очень непонятно, что вас смущает. Конечно, весь код выполняется до конца, как только обработчик "ловит"  .Changed или .Ended. То, что вы поставили печать вначале говорит о том, что вы всегда будете печатать измененное значение recognizer.scale, потому что он поставляется обработчику жеста системой, которая уже зафиксировала изменения в этом жесте. То, что в конце распечатывается 1 - это сработало .Ended. Что непонятно? Что вы хотите увидеть? Обработчик жеста только обрабатывает уже распознанный системой жест. Система распознает жест и подает нужную информацию recognizer: UIPinchGestureRecognizer в обработчик:

func pinch (recognizer: UIPinchGestureRecognizer ) {

 ......

вторник, 14 июня 2016 г., 20:46:06 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jun 15, 2016, 3:33:24 AM6/15/16
to Swift [ru]
Татьяна, спасибо.

Я сделал самостоятельно вариант управление бровями: https://github.com/llodi/FaceIt_cs193p_Spring

Rotation-жест добавял через storyboard. обработчик выглядет так:

@IBAction func turnEyeBrows(recognizer: UIRotationGestureRecognizer) {
 
if recognizer.rotation > 0 {
 expression
.eyeBrows = expression.eyeBrows.moreRelaxedBrow()
 
} else {  
 expression
.eyeBrows = expression.eyeBrows.moreFurrowedBrow()  
 
}  
 
}



tatiana.kornilova

unread,
Jun 15, 2016, 5:24:34 AM6/15/16
to Swift [ru]
С точки зрения программирования все прекрасно, а логически - не совсем. Жест rotation - непрерывный жест, и хочется управлять "бровями" непрерывно, через свойство eyeBrowTiltпотому что пользователь (в данном случае я) уже ждет, что будет происходить что-то продолжительное, как например, управление scale жестом pinch. Попробуйте поуправлять eyeBrowTilt ,это интереснее.

среда, 15 июня 2016 г., 10:33:24 UTC+3 пользователь Ilya Dolgopolov написал:
Reply all
Reply to author
Forward
0 new messages