IOS9 2016. Лекция 4. Views

50 views
Skip to first unread message

Лётчик Космос

unread,
Jun 10, 2016, 9:27:20 AM6/10/16
to Swift [ru]
 Добрый день!

Предлагаю здесь обсудить все вопросы, которые могли возникнуть после просмотра лекции №4 Views

 Мой вопрос: я не понял вот этот момент https://youtu.be/jcxp1bbXbL4?t=3002

Почему мы не можем использовать Rect, что такое frame  и bounds?

Лётчик Космос

unread,
Jun 10, 2016, 9:30:24 AM6/10/16
to Swift [ru]
Чем отличается bounds.size.width от bounds.width ?

пятница, 10 июня 2016 г., 16:27:20 UTC+3 пользователь Лётчик Космос написал:

tatiana.kornilova

unread,
Jun 10, 2016, 9:45:30 AM6/10/16
to Swift [ru]
Такого нет bounds.width

пятница, 10 июня 2016 г., 16:30:24 UTC+3 пользователь Лётчик Космос написал:

tatiana.kornilova

unread,
Jun 10, 2016, 9:51:19 AM6/10/16
to Swift [ru]
Если вы посмотрите тот gmail, c которым вы зарегистрировались на этом форуме, то увидите, что вам как активному участнику форума послано приглашение на просмотр русскоязычного перевода (практически дословного) лекций курса iOS 9. На лекции 4 профессор об этом рассказывает. Но если вы не обнаружите это приглашение или вам все равно будет непонятна разница между bounds и  frame, то будем обсуждать обязательно. Дайте знать.


пятница, 10 июня 2016 г., 16:27:20 UTC+3 пользователь Лётчик Космос написал:
 Добрый день!

Лётчик Космос

unread,
Jun 10, 2016, 10:09:54 AM6/10/16
to Swift [ru]
Спасибо, Татьяна!

Письма пришли.
Это просто настоящий клад:) Думаю вопросов после подробного изучения лекций остаться уже не должно.


пятница, 10 июня 2016 г., 16:51:19 UTC+3 пользователь tatiana.kornilova написал:

tatiana.kornilova

unread,
Jun 10, 2016, 10:14:16 AM6/10/16
to Swift [ru]
А жаль, приветствуем любые вопросы. На самом деле вы, конечно, поймете разницу между  frame и boubds, а вот почему нельзя использовать Rect в drawRect требует подробных объяснений. Может быть кто-то из участников форума вам даст объяснение, а если - нет, то смогу ответить только завтра.

пятница, 10 июня 2016 г., 17:09:54 UTC+3 пользователь Лётчик Космос написал:

tatiana.kornilova

unread,
Jun 10, 2016, 10:53:41 AM6/10/16
to Swift [ru]
До меня только сейчас дошло, что вы пришли на этот форум независимо от моего сайта. Так что я вам сообщаю, что у меня есть довольно популярный сайт "Обучающий курс по разработке iOS+Swift+Objective-C приложений." 
Добро пожаловать. Там очень много материалов по стэнфордским курсам.
пятница, 10 июня 2016 г., 17:09:54 UTC+3 пользователь Лётчик Космос написал:

Лётчик Космос

unread,
Jun 11, 2016, 9:37:36 AM6/11/16
to Swift [ru]
Я точно не помню, но по-моему всё-таки попал сюда через ваш сайт) Он один из первых выпадает в результатах поиска по ключевым словам "stanford ios cs193p"

На вашем сайте недавно смотрел подробное описание решения задания 1, вроде, как у меня уже готово задание 1, но всё равно обнаружил у себя много недочетов, а также получил много дополнительной информации. 
Спасибо!

пятница, 10 июня 2016 г., 17:53:41 UTC+3 пользователь tatiana.kornilova написал:

Ilya Dolgopolov

unread,
Jun 11, 2016, 12:56:26 PM6/11/16
to Swift [ru]
почему нельзя использовать Rect в drawRect потому что это перерисовывает все на экране и соответственно грузит систему, я ведь правильно понял?

пятница, 10 июня 2016 г., 17:14:16 UTC+3 пользователь tatiana.kornilova написал:

Ilya Dolgopolov

unread,
Jun 11, 2016, 12:59:51 PM6/11/16
to Swift [ru]
Вот кстати то, что он говорил на инглише понятно, но не совсем понятно логика ) получается frame - это внешняя система координат (view) по отношению в subview. но получается для любого члена subview можно получить координату относительно subview и относительно view? Еще не совсем я понял про центр с перекошенным прямоугольником, опять же не понятно логически (((


пятница, 10 июня 2016 г., 16:51:19 UTC+3 пользователь tatiana.kornilova написал:
Если вы посмотрите тот gmail, c которым вы зарегистрировались на этом форуме, то увидите, что вам как активному участнику форума послано приглашение на просмотр русскоязычного перевода (практически дословного) лекций курса iOS 9. На лекции 4 профессор об этом рассказывает. Но если вы не обнаружите это приглашение или вам все равно будет непонятна разница между bounds и  frame, то будем обсуждать обязательно. Дайте знать.

tatiana.kornilova

unread,
Jun 11, 2016, 3:32:16 PM6/11/16
to Swift [ru]
У каждого view есть внутренняя система координат, связанная непосредственно с самим прямоугольником этого view, то есть bounds. В этой системе координат мы обычно рисуем внутри view и именно она используется в drawRect. При этом, хотя  bounds - это прямоугольник, описываемый структурой Rect,  у которого есть origin - смещение и size - размер, для  bounds имеет смысл только size, а смещение origin может быть любым и, как правило, не используется. 
Но почти у каждого view есть superview и причем единственный. У этого superview  тоже есть его собственная внутренняя система координат, в которой он должен указать прямоугольник, в котором размещается наш исходный view, а для него это subview.  Ваш исходный view может размещаться в superview со смещением и даже в повернутом состоянии (указано на рисунке на лекции). Как вам указать, каким образом будет размещаться ваш исходный view в своем superview? Во-первых, вы должны это сделать во внутренней системе координат  superview, которая является внешней по отношению к вашему исходному view. Во- вторых, вы должны указать прямоугольник frame, который покрывает ваш исходный view, то есть указать смешение origin и размер size. 
В обычном, неповернутом состоянии, bounds.size = frame.size.
Если ваш исходный view попадает на superview в повернутом состоянии, то обычно  frame.size не равен  bounds.size.
Еще у каждого view есть свойство center, которое отражает положение центра вашего исходного view в  системе координат  superview, а не координаты центра во внутренней системе координат  вашего исходного view. Профессор обращает на это особое внимание из-за большого количества ошибок при использовании этого свойства.
По-моему, все понятно.
суббота, 11 июня 2016 г., 19:59:51 UTC+3 пользователь Ilya Dolgopolov написал:

tatiana.kornilova

unread,
Jun 11, 2016, 3:38:36 PM6/11/16
to Swift [ru]
В дополнение к моему ответу. Представьте, что ваш исходный view -  кнопка, а superview - это Stack в Калькуляторе. И читайте мой ответ в этом ключе.


суббота, 11 июня 2016 г., 19:59:51 UTC+3 пользователь Ilya Dolgopolov написал:
Вот кстати то, что он говорил на инглише понятно, но не совсем понятно логика ) получается frame - это внешняя система координат (view) по отношению в subview. но получается для любого члена subview можно получить координату относительно subview и относительно view? Еще не совсем я понял про центр с перекошенным прямоугольником, опять же не понятно логически (((

Лётчик Космос

unread,
Jun 11, 2016, 3:48:10 PM6/11/16
to Swift [ru]
Вопрос про инициализаторы UIView. 
  • init (frame: CGRect) // инициализатор, если UIView создается в коде
    init (code:NSCoder)
    // инициализатор, если UIView приходит со storyboard. 

View,  которые создается в коде, я могу себе представить. Подскажите, что означает фраза View приходит со  storyboard? Можно пример и для чего нам потребуется для него писать инициализаторы?


суббота, 11 июня 2016 г., 22:38:36 UTC+3 пользователь tatiana.kornilova написал:

Ilya Dolgopolov (llodi)

unread,
Jun 12, 2016, 12:30:31 AM6/12/16
to tatiana.kornilova, Swift [ru]
Татьяна, Спасибо! Мне просто нужно было убедиться, что то как я понял тему, просмотрев ее 2 раза, соответствует правде :) 
Значит я понял верно :)

11 июня 2016 г., в 22:32, tatiana.kornilova <tatiana....@gmail.com> написал(а):

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Swift [ru]".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/swiftru/DK58hjOhHfE/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес swiftru+u...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес swi...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/swiftru/7a18f51f-5da4-49ce-ae86-241ea4d3dc2e%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Лётчик Космос

unread,
Jun 12, 2016, 1:48:04 AM6/12/16
to Swift [ru]
"При этом, хотя  bounds - это прямоугольник, описываемый структурой Rect,  у которого есть origin - смещение и size - размер, для  bounds имеет смысл только size, а смещение origin может быть любым и, как правило, не используется. "

Глядя на слайд профессора, складывается впечатление, что  origin у bounds всегда будет 0,0. Origin это смещение внутри frame? Frame это наименьший прямоугольник, который покрывает bounds.

Если origin  не 0,0 , то как будет выглядеть вся эта картина?

суббота, 11 июня 2016 г., 22:32:16 UTC+3 пользователь tatiana.kornilova написал:

tatiana.kornilova

unread,
Jun 12, 2016, 2:24:17 AM6/12/16
to Swift [ru]
У bounds свой origin, у frame -свой origin. Они, скорее всего, разные. У frame,  как правило, origin не (0,0), origin у bounds - это в собственной системе координат, какая вам разница куда будет сдвинут прямоугольник в собственной системе координат? Проще положить (0,0). А вот у frame все серьезно - нужно показывать реальное расположение. 

воскресенье, 12 июня 2016 г., 8:48:04 UTC+3 пользователь Лётчик Космос написал:

tatiana.kornilova

unread,
Jun 13, 2016, 3:37:06 AM6/13/16
to Swift [ru]
В настоящее время в 99% случаев, View Controller приходят в жизнь из storyboard, то есть создаются системой iOS автоматически, а вместе с ними и  UIView на  storyboard. Например, кнопки в Calculator. Вы можете получить ( с помощью CTRL-перетягивания) outlets на них и устанавливать их атрибуты или Action и "руководить" событиями "нажатия" кнопки или другими, но создаются они системой на основании того, что вы разместили на storyboard.
Можно кнопку создать в коде (у меня при создании адаптивного интерфейса в Задании 2 создается недостающая кнопка)

  private lazy var buttonBlank:UIButton = {

        let button = UIButton(frame: CGRectMake(100, 400, 100, 50))

        button.backgroundColor = UIColor.blackColor()

        button.setTitle("", forState: UIControlState.Normal)

        return button

    }()

Но Заданиях 1 и 2 мы работаем с кнопками, пришедшими со  storyboard.

  

суббота, 11 июня 2016 г., 22:48:10 UTC+3 пользователь Лётчик Космос написал:
Reply all
Reply to author
Forward
0 new messages