2013-11-28 3 views
0

Я уже возился и пытался сделать свое приложение для обмена сообщениями (для практики). Я добавляю обычай UIView к стандарту UIScrollView на основе IBAction.Добавление нескольких подзаголовков в UIScrollView

Каждый раз, когда пользователь нажимает кнопку, я сделать следующее (в порядке убывания):

  • Перечислят подвиды в Scrollview и увеличивает значение в целого числа. Я использую это int, чтобы установить y-позицию нового пользовательского вида
  • Создайте пользовательский UIView с размером рамки, который изменяется только по ширине. Вид имеет UILabel поверх него, у которого есть текст.
  • Создайте новый CGSize, который я использую для установки contentSize UIScrollView. Новый CGSize - это ширина прокруткиView + высота пользовательского вида + некоторое дополнение.
  • Затем я установил contentSize прокрутки.
  • Затем я добавляю пользовательский вид в качестве подсмотра scrollView.

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

Теперь я знаю несколько вещей: мне нужно добавить subviews в отдельный поток, так как они не будут добавлены во время прокрутки пользователя. Я знаю, что мне нужно будет «очистить» подпункты, поскольку они создаются, так как мое приложение будет продолжать есть память, так как добавляется больше подзаголовков. Я также знаю, что я должен переместить UIScrollView, поскольку сообщения добавляются, так как нет смысла добавлять их за пределы видимой области. Наконец, я не думаю, что перечисляя подвидов очень элегантно ... так я изменю, что позже ... и не является температура UILabel я делаю ... Теперь для некоторого кода:

- (void)pushMyMessage:(NSString *)message 
{ 
UILabel *tempLabel = [[UILabel alloc]init]; 
tempLabel.text = message; 
[tempLabel sizeToFit]; 

//adding the new message as a subview below any previous messages 
    if (self.messageView.subviews.count > 0) 
    { 
     int yIndex = 0; 

     for (SDMessageView *view in self.messageView.subviews) 
     { 
     //increase the y value for the frame of the next message 
     yIndex += view.frame.size.height; 
     //add a little padding 
     yIndex += 5; 
     } 

    SDMessageView *newMessage = [[SDMessageView alloc]initWithFrame:CGRectMake(20, yIndex, tempLabel.frame.size.width + 8, tempLabel.frame.size.height) setMessage:message]; 
    CGSize newSize = CGSizeMake(self.messageView.frame.size.width, self.messageView.contentSize.height + newMessage.frame.size.height + 30); 
    [self.messageView setContentSize:newSize]; 
    [self.messageView addSubview:newMessage]; 
    } 
else 
    { 
    //initial message 
    SDMessageView *newMessage = [[SDMessageView alloc]initWithFrame:CGRectMake(20, 20, tempLabel.frame.size.width + 8, tempLabel.frame.size.height) setMessage:message]; 
    CGSize newSize = CGSizeMake(self.messageView.frame.size.width, self.messageView.contentSize.height + newMessage.frame.size.height + 30); 
    [self.messageView setContentSize:newSize]; 
    [self.messageView addSubview:newMessage]; 
    } 
} 

Любые идеи о почему подпункты добавляются только во время просмотра? Кроме того, любые идеи о том, как я могу сделать это эффективно?

Спасибо за любую помощь заранее!

+1

Я бы предположил, что вы должны использовать UITableView вместо scrollview, а в ячейке задайте свой вид сообщения, используя табличный вид, будет очень легко управлять интерфейсом. Я нашел некоторые ссылки, на которых вы можете увидеть какое-то приложение для сообщений iOS, такое как пользовательский интерфейс, вы можете его изменить и использовать в соответствии с вашими потребностями. 1) http://maniacdev.com/2013/03/open-source-ios-control-providing-an-easy-to-implement-messages-app-like-user-interface 2) http://maniacdev.com/2012/08/open-source-custom-ios-uitableview-control-for-chat-bubbles-like-the-messages-app –

+0

@VishwaPatel - удивительный. Я займусь этим. –

ответ

0

Несколько вещей, которые я заметил, читая ваш пост:

  1. Вы не должны вносить какие-либо изменения интерфейса UI (например, добавление подвидов) на вторичном потоке, то это должно быть сделано на главном потоке.
  2. Почему вы не используете UITableView для отображения сообщений? Если вы используете табличное представление, вам не нужно вычислять все кадры, размеры контента и т. Д., Просто нужно дать правильную высоту ячейке, и это будет эффективным способом решения того, что вы пытаетесь достичь.
  3. Я не совсем понял, почему ваши подвидности не добавлены в скрытую область прокрутки, в моей практике я не заметил такого поведения прокрутки (я использовал его много), там должна быть какая-то другая проблема с вашим кодом (вы добавляете subviews на вторичный поток?).

Надеюсь, это было полезно, удачи!

+0

1. Действительно? Я решил добавить subviews на вторичный поток, чтобы дать пользователю возможность продолжить прокрутку вверх/вниз или перейти на новую вкладку. Сообщения отправляются на сервер прямо перед добавлением сообщения/подзаголовка на экран ... Я не уверен, какая там лучшая практика. 2. Я полностью забыл 'UITableView'. Скорее всего, я переключусь на это. 3. Единственное, что я могу придумать, это то, как я вычисляю yIndex, который позиционирует новое subview. Либо это, либо это ошибка с симулятором. Я застрял с помощью симулятора, пока я не обновил свою учетную запись Dev. –

Смежные вопросы