Урок 6 Месенджер


#1

Доброго дня всем! Дело такое застрял на выравнивании label в content view
Вот код:
let screenWidth = UIScreen.main.bounds.width
> contentView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: 100)

    profileImageView.center = CGPoint(x: 50, y: 50)
    profileImageView.layer.cornerRadius = 10
    profileImageView.clipsToBounds = true
    loginLabel.center = CGPoint(x: 120, y: 50)
    loginLabel.textAlignment = .left
    loginLabel.bounds.size.width = screenWidth / 2
    emailLabel.center = CGPoint(x: 120, y: 80)
    emailLabel.textAlignment = .left
    emailLabel.bounds.size.width = screenWidth / 2

У меня loginLabel и emailLabel наезжают на profileImageView при любом экране. Подскажите, что я не так делаю
Вот скрин


#2

чтоби чуть исправить попробуйте задать x = 200 , потом можете посмотреть картинку если textAlignment = .center для login and email label


#3

пробовал так:

loginLabel.center = CGPoint(x: 175, y: 50)
emailLabel.center = CGPoint(x: 175, y: 80)

При этом варианте на экране 6,6s смотрится не плохо, а вот на 5 уезжает долговато от Image, вот и обратился к сообществу, может быть есть какое-то универсальное решение?

Попробовал еще вот так:

loginLabel.center = CGPoint(x: screenWidth / 1.75, y: 50)
emailLabel.center = CGPoint(x: screenWidth / 1.75, y: 80)

Более-менее приемлемо, но возможно есть более идиальный вариант?


#4

Смотрите в сторону autolayout.


#5

Вы имеете ввиду constraints ?


#6

Да (ох уж это ограничение на сообщения не меньще 20 мимволов)


#7

Про этот выход я знаю, но цель урока в курсе как раз не используя IB, програмно расположить элементы, используя код… Так бы я и не мучался вовсе=) На видео у Ивана же ничего друг на друга не налазиет-)

Мне не понятен момент, почему Image нормально располагается по координатам, а label правильно располагается только по “у”, а по “х” плывет. Подозреваю что это из-за того, что Image имеет четкие размеры, но не уверен.


#8

А, так это урок )
Ну, у вас imageView квадратный и width/height = row height - 8 (вроде бы 8), так что там x label должно быть row height.


#9

Что-то я запутался=) Высота ячейки custom и равна 100, изображение 80х80, центр изображения в координатах 50,50. Получается что для правильного позиционирования label нужно чтобы его ширина была фиксированная и начало его было в точке 120 от левого края и 50,80 от верхнего, но в видиоуроке Иван никак не фиксирует ширину label, кроме как:

loginLabel.bounds.size.width = screenWidth / 2
emailLabel.bounds.size.width = screenWidth / 2

Но я так понимаю что вот этот код

loginLabel.center = CGPoint(x: 120, y: 50)
emailLabel.center = CGPoint(x: 120, y: 80)

говорит о том что середина фрейма Label находится в точке 120, правильно?
как указать что там должна быть не середина и начало и почему тогда у Ивана все норм? Может ли это быть связано с версией Xcode?

P.S. Вот эта строка

loginLabel.center = CGPoint(x: 120, y: 50)

Взята из видеоурока, переписано под swift 3, в оригинале она вот так выглядит:

loginLabel.center = CGPointMake(120, 50)


#10

x: 110 - проверил на 5, 5s, 6, 7 - выглядит одинаково.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    
    let imageView = UIImageView()
    imageView.frame.size = CGSize(width: 80, height: 80)
    imageView.center = CGPoint(x: 50, y: 50)
    imageView.backgroundColor = UIColor.blue
    cell.addSubview(imageView)
    
    let text1 = UILabel()
    text1.frame.size = CGSize(width: 100, height: 20)
    text1.center = CGPoint(x: 110, y: 50)
    text1.textAlignment = .center
    text1.text = "text1"
    text1.font = UIFont.preferredFont(forTextStyle: .footnote)
    text1.textColor = .black

    cell.addSubview(text1)
    
    let text2 = UILabel()
    
    text2.frame.size = CGSize(width: 100, height: 20)
    text2.center = CGPoint(x: 110, y: 80)
    text2.textAlignment = .center
    text2.font = UIFont.preferredFont(forTextStyle: .footnote)
    text2.textColor = .black

    text2.text = "text2"
    cell.addSubview(text2)
    
    return cell
}

Код писал на скорую руку, лишь бы проверить.


#11

Вот из-за этого у вас все норм=) попробуйте
text1.textAlignment = .left


#12

ну если ровнять по левому краю - тогда запустите етот код Ookey `я только для лейблов text1.center = CGPoint(x: 155 , height: 20 ) - и не будет ничего накладиватся
Ми вам точно не ответим как там в уроке )) может дальше контсрейти сталяться а Ви недосмотрели
Главное последовательность и логика в ростановке елементов


#13

Вот ссылка на курс http://rgho.st/7lbjt7xMY =)


#14

почему код в ячейки иммено такой - я не знаю
Но смотрите сюди если ви закоментируете строчки из виравниванием - то все будет ОК :slight_smile:

а если и писать центр как в сториборде - то ето будет 96 + 216/2 = 204


#15

Да в том то и дела, что если закоментить, то все понятно=) Я просто целый день убил и никак не пойму что не так делаю, оказывается я не одинок, кто не понимает код этот=) Значит можно ставить точку и считать что это опечатка=) и вместо left нужно использовать center =)


#16

Как-то на автомате поставил align center, тогда 110 заменить на 150 и будет все ок.

P.S. На файл и сайт браузер ругается.


#17

Странно что ругается, у меня в safari все норм=)