Как получить ширину ячейки в соответствии с устройством в cellForRowAtIndexPath. Я использую Autolayout и UITableViewAutomaticDimension

Моя пользовательская ячейка и дизайн storyboard находятся в iPhone8, а ширина Label - 355, но когда я запускаю проект в iPhone5, я хочу ширину 300 в соответствии с iPhone5, но когда я NSLog ширина метки, я все равно получаю 355. Как я могу получить Label шириной 300 в iPhone5?

Ребята подскажите пожалуйста, как можно получить ширину Label в зависимости от устройства

вот моя ссылка на код

https://drive.google.com/open?id=1Z2bHhKS_s6P6uICqssaW0gNTDGM-p9vL

Пожалуйста, помоги мне

Вместо ширины жесткого кодирования используйте UIScreen.main.bounds.width для ширины ячейки.

Rakesha Shastri 10.08.2018 14:50

вы используете ячейку с фактически возвращаемым размером ячейки из xib.

Abu Ul Hassan 10.08.2018 14:51

Также вы можете попробовать зарегистрировать ячейку в viewDidLoad, если вы зарегистрируете ее для tableView, а затем повторно используете в cellForRowAtIndex, вы получите желаемое поведение.

Abu Ul Hassan 10.08.2018 14:53

@AbuUlHassan, как я могу это сделать, пожалуйста, уточнить. я думаю, ты понимаешь мою настоящую проблему

Ankur Patel 10.08.2018 14:55

проверьте мой ответ ниже и внесите свои поправки. :)

Abu Ul Hassan 10.08.2018 14:59

Вы можете получить фактическую ширину ячейки в делегате TableView делегата CellWillAppear.

vivekDas 10.08.2018 15:38

вы занимаетесь методом делегата willDisplayCell? если да, я не могу использовать, потому что вызов willDisplayCell после cellForRowAtIndexPath.

Ankur Patel 10.08.2018 15:43

@AnkurPatel - объясните Зачем, который вам нужен. Очень возможно, что вы задаете неправильный вопрос.

DonMag 10.08.2018 16:32

@DonMag Мне нужна ширина UILabel, потому что я хочу рассчитать размер данных. Чтобы рассчитать размер данных, мне нужно передать шрифт, размер UILabel для расчета размера данных. Когда я использую размер UILabel для расчета данных, я получаю размер UILabel в соответствии с iPhone8 в iPhone5. На самом деле мне нужен размер UILabel в соответствии с устройством, чтобы получить идеальный размер данных

Ankur Patel 10.08.2018 18:01

@AnkurPatel - хммм ... во-первых, ячейка и рамка метки недоступны, пока механизм компоновки не отрендерит их - чего не происходит на cellForRowAt или prepareForReuse, поэтому вам нужно пересмотреть свой подход. Кроме того, что вы собираетесь делать, когда пользователь поворачивает устройство? Или использует сплит-просмотр? Можно ли использовать автоматическое масштабирование шрифта? Или просто обрезать или обрезать текст? Или использовать многострочные метки?

DonMag 10.08.2018 19:36

я просто обрезаю или обрезаю текст и использую многострочные метки

Ankur Patel 10.08.2018 19:46

на самом деле весь мой код ячейки является динамическим, что означает, что какая-то ячейка имеет высоту 100, ячейка имеет высоту 200 и так далее.

Ankur Patel 10.08.2018 19:47

после расчета моих данных я должен переместиться ниже части UIlabel.

Ankur Patel 10.08.2018 19:48

@AnkurPatel - в общем, вам намного лучше использовать автоматическую компоновку и ограничения для обработки динамического изменения размера ваших ячеек. Ничто из того, что вы здесь сказали, не описывает то, что вы пытаетесь сделать. Это почти похоже на курицу или яйцо ... Вам нужен размер, прежде чем вы решите, что показывать, но решение, каким должно быть должен, должно быть тем, что определяет размер.

DonMag 13.08.2018 19:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
14
129
2

Ответы 2

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell_iPhone"
                             bundle:[NSBundle mainBundle]]
             forCellReuseIdentifier:@"CustomCell"];
    }


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell_iPhone *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    return cell;

}

Сбой моего приложения и указание причины ошибки ниже: 'недопустимый наконечник зарегистрирован для идентификатора (CustomCell) - наконечник должен содержать ровно один объект верхнего уровня, который должен быть экземпляром UITableViewCell'

Ankur Patel 10.08.2018 15:05

достал вам перо и проверьте, установлен ли в инспекторе атрибутов CustomCell в поле reuseIdentifier.

Abu Ul Hassan 10.08.2018 15:06

где я могу получить reuseIdentifier? Извините, я не понимаю

Ankur Patel 10.08.2018 15:08

@AnkurPatel Я объяснил причину сбоя в своем ответе

Sh_Khan 10.08.2018 15:10

после выбора пера вы увидите иерархию представлений на левой панели, щелкните на своем uitableViewCell, затем вы получите его на правой панели.

Abu Ul Hassan 10.08.2018 15:11

Я уже установил идентификатор CustomCell, вы говорите об идентификаторе?

Ankur Patel 10.08.2018 15:14

именно ... я говорю об этом.

Abu Ul Hassan 10.08.2018 15:17

Я сделал необходимый шаг. Я уже установил идентификатор как CustomCell. все еще я получаю сбой

Ankur Patel 10.08.2018 15:19

Не нужно указывать идентификатор в xib, если вы зарегистрируете его, используйте тот же идентификатор

Sh_Khan 10.08.2018 15:23

хорошо, я понял, тогда используйте имя пера вместо CustomCell_iPhone, пожалуйста. [self.tableView registerNib: [UINib nibWithNibName: @ Пакет CustomCell_iPhone: [NSBundle mainBundle]] forCellReuseIdentifier: @ "CustomCell"];

Abu Ul Hassan 10.08.2018 18:05

Печать кадра ячейки / подвидов в cellForRowAt дает неверные значения, поскольку ячейка еще не заложена, ваши ячейки отображаются правильно, но вы должны зарегистрировать ячейку вместо этой строки

cell = [[[NSBundle mainBundle] loadNibNamed:@"CustomCell_iPhone" owner:self options:nil] objectAtIndex:0];

Я вижу ниже правильную строку, и вы ее прокомментировали, если вы хотите показать правильные фреймы, распечатайте их внутри метода layoutSubviews пользовательского класса ячеек, также xib должен содержать только одну корневую ячейку, поэтому вам нужно удалить одну из этих ячеек, если вы хотите использовать оба для tableView, а затем создать отдельный xib для каждого

//

-(void) layoutSubviews {
   [super layoutSubviews];
   // NSLog here 
}

//

Поскольку у вас tableView занимает всю ширину экрана, и вы устанавливаете поле ячейки равным 10 с обеих сторон, вы можете использовать это, чтобы получить ширину lbl внутри cellForRowAt

CGFloat wid = [[UIScreen mainScreen] bounds].size.width - 20

да, вы можете удалить вторую ячейку. Я использую layoutSubviews в CustomCell.m, но не могу получить фрейм в зависимости от устройства.

Ankur Patel 10.08.2018 15:11

Нет, он дает правильное значение, в вашем файле его тоже нет

Sh_Khan 10.08.2018 15:15

Могу ли я написать layoutSubviews в файле CustomCell.M? Мой UItableView в UIViewControler

Ankur Patel 10.08.2018 15:16

внутри CustomCell.M

Sh_Khan 10.08.2018 15:16

- (недействительно) layoutSubviews {[super layoutSubviews]; NSLog (@ "lblTemp frame3:% @", NSStringFromCGRect (self.lblTemp.frame)); } внутри Customcell 2018-08-10 18: 51: 14.895155 + 0530 demoCell [11042: 6883850] lblTemp frame3: {{10, 10}, {355, 80}} Мне нужна фактическая ширина в cellForRowAtIndexPath, потому что мне нужно выполнить некоторые вычисления . И вызов метода layoutSubviews после возврата ячейки из cellForRowAtIndexPath

Ankur Patel 10.08.2018 15:23

Привет ты их

Ankur Patel 10.08.2018 15:28

CGFloat wid = [[UIScreen mainScreen] bounds] .size.width - 20 Я не могу этого сделать, потому что на самом деле у меня много объектов, поэтому я не могу использовать 20 значений жесткого ядра для получения ширины.

Ankur Patel 10.08.2018 15:33

На самом деле для демонстрации я использую только UILabel в Первоначально там 2 UILabels Один UIImageView и рядом с UIImageView есть UILabel, поэтому "Хан", извините, я не могу использовать значение 20 в качестве жесткого ядра, а размер моей ячейки динамический

Ankur Patel 10.08.2018 15:34

Позвольте нам продолжить обсуждение в чате.

Ankur Patel 10.08.2018 15:35

Не знаю, какой расчет вы хотите, если он не соответствует ссылке на ячейку, тогда получите ссылку на Vc внутри ячейки, а затем делайте то, что хотите, с помощью layoutSubviews

Sh_Khan 10.08.2018 15:38

Согласно ширине UILabel я должен рассчитать размер данных. Чтобы рассчитать размер данных, мне нужен размер UIlabel, связанный с iPhone5, но я получаю размер UIlabel iPhone8.

Ankur Patel 10.08.2018 15:41

в iPhone5 я получаю iPhone8 UIlabel size 2018-08-10 19: 01: 21.591964 + 0530 demoCell [11575: 6891249] lblTemp frame3: {{10, 10}, {355, 80}}

Ankur Patel 10.08.2018 15:41

привет @sh_khan ты их?

Ankur Patel 10.08.2018 15:55

Другие вопросы по теме