Nano Hash - криптовалюты, майнинг, программирование

Как добавить представление ниже другого представления в ViewController в iOS?

В моем приложении я создаю контроллер представления со смесью UILabel и UITextview, которые хотят прокручиваться, потому что текст является динамическим, а также превышает размер экрана по вертикали.

В настоящее время у меня есть Scrollview, который имеет подвиды, как показано ниже. Представления создаются в Xcode 4.3 Storyboard.

UILabel1(произнести заголовок)

UITextView1 (динамический текст любого размера)

UILabel2 (второй заголовок)

UITextView2 (динамический текст любого размера)

и так далее.

Проблема в

Когда UITextView1 имеет больше контента, он перекрывается с UILabel2, чего я не хочу.

Я хотел бы иметь UILabel1 поверх scrollView и UITextView1 под UILabel1. UILabel2 ниже UITextView1 и так далее.

Что я должен сделать, чтобы достичь этого?

РЕДАКТИРОВАТЬ

В раскадровке

![введите здесь описание изображения][1]

В симуляторе

![введите здесь описание изображения][2]

Спасибо за помощь ребята. Очень признателен.

Код

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

[scrollView setScrollEnabled:YES];     
[self.view addSubview:cockTailNameLabel];
[self.view insertSubview:txtIngredients belowSubview:cockTailNameLabel];
[self.view insertSubview:scrollView belowSubview:cockTailNameLabel];
//[scrollView]

[self.cockTailNameLabel setText:self.passcockTailName];  

[_txtUse setText:self.passUse]; 
[_txtUse setEditable:NO];
[_txtUse setUserInteractionEnabled:NO];

CGRect useFrame = _txtUse.frame;
useFrame.size.height = _txtUse.contentSize.height;
_txtUse.frame = useFrame; 

[txtIngredients setText:self.passIngredients];
[txtIngredients setEditable:NO];
[txtIngredients setUserInteractionEnabled:NO];
CGRect ingredientFrame = txtIngredients.frame;
ingredientFrame.size.height = txtIngredients.contentSize.height;
txtIngredients.frame = ingredientFrame;  


[txtRecipe setText:self.passReceipe];
[txtRecipe setEditable:NO];
[txtRecipe setUserInteractionEnabled:NO];
CGRect recipeFrame = txtIngredients.frame;
recipeFrame.size.height = txtRecipe.contentSize.height;
txtRecipe.frame = recipeFrame;

[scrollView insertSubview:_txtUse belowSubview:cockTailNameLabel];
[scrollView insertSubview:titleIngredients belowSubview:_txtUse];
[scrollView insertSubview:txtIngredients belowSubview:titleIngredients];
[scrollView insertSubview:btnReceipe belowSubview:txtIngredients];
[scrollView insertSubview:btnHome belowSubview:txtIngredients];
[scrollView insertSubview:txtRecipe belowSubview:btnHome];
[scrollView insertSubview:btnfacebookShare belowSubview:txtRecipe];
[scrollView insertSubview:btnTwitterShare belowSubview:txtRecipe];



/*[scrollView addSubview:_txtUse];
[scrollView addSubview:titleIngredients];
[scrollView addSubview:txtIngredients];
[scrollView addSubview:btnReceipe];
[scrollView addSubview:btnHome];
[scrollView addSubview:txtRecipe];
[scrollView addSubview:btnfacebookShare];
[scrollView addSubview:btnTwitterShare];*/

[scrollView setContentSize:CGSizeMake(320, 1000)];

NSLog(@"RecipeName :%@ ",passcockTailName);

}


Ответы:


1

В Storyboard или IB вы можете свободно их переставлять.

В коде вы делаете - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview.

07.08.2012
  • Спасибо за Ваш ответ. Я хочу добавить эти представления в UIScrollView как этого добиться... будет ли это работать? 08.08.2012
  • Все ли просмотры есть в вашей раскадровке? В левом нижнем углу раскадровки есть кнопка со стрелкой, и когда вы ее развернете, вы увидите элементы пользовательского интерфейса в списке. В вашем прокрутке чем ниже вы находитесь в этом списке, тем выше позиционируется элемент. Таким образом, вы просто переупорядочиваете их так, как вам нравится. 08.08.2012
  • Да, все просмотры в раскадровке. Я не могу проверить это сейчас, потому что у меня нет Mac дома, я проверю его завтра и дам вам знать, спасибо за вашу поддержку. +1 08.08.2012
  • хм... странно. можете ли вы загрузить скриншот своей раскадровки, если вы все еще хотите попробовать? 08.08.2012
  • ohohoh .... под ниже вы имеете в виду под, то есть когда у вас много текста, другие вещи смещаются вниз? Я думал, вы говорите о многослойности. 08.08.2012
  • давайте продолжим это обсуждение в чате 08.08.2012
  • Привет, iBlue.. Если бы вы могли посмотреть mypost пожалуйста... Я столкнулся с проблемой отправки данных из одного представления в другое. Спасибо 09.08.2012
  • @iBlue..у меня небольшая проблема с отображением содержимого.. Как мы обсуждали в тот день, он отлично работает.. Я использую делегата в этом представлении. Поэтому, когда я нажимаю одну кнопку, он переходит в другое представление.. затем он возвращается к представлению с динамическими деталями.. Проблема здесь в том, что кадр CGRect увеличивается в размере.. У вас есть идеи, пожалуйста.. Много ценится 13.08.2012
  • Я думаю, вы используете += ? Когда вы вернетесь назад, представление уже загружено, поэтому ваши изменения в кадрах уже вступили в силу. Бьюсь об заклад, код, который выполняет приращение, снова выполняется. Помните, на днях я говорил вам быть осторожным с +=? 13.08.2012
  • Ву.. Да, спасибо за ваш ответ, чувак.. да, я думаю, что это будет проблемой.. В таком случае, что я должен использовать для += суммы Blue.. Извините, что спрашиваю вас снова 13.08.2012
  • либо вызовите метод в viewDidLoad, если содержимое не изменится, либо избегайте += (просто установите значение напрямую, например a.frame.size.width = 500 или что-то в этом роде), либо сначала установите высоту по умолчанию, а затем используйте +=. 13.08.2012
  • Я использую делегат, поэтому думаю, что не могу использовать этот метод в ViewDidLoad. Можно ли вызвать ViewDidLoad из делегата.. высота обратно по умолчанию в смысле до 0. 13.08.2012
  • я не уверен, что вы имели в виду, но только один из двух вариантов: либо ваш код, который регулирует высоту, выполняется только при первой загрузке представления, либо ваш код изменяет высоту только тогда, когда она не была изменена. Вы определенно можете сначала установить высоту на 0, а затем сделать +=. 13.08.2012
  • давайте продолжим это обсуждение в чате 13.08.2012

  • 2

    В коде (в viewDidLoad):

    UIScrollView *scroll =[[UIScrollView alloc] initWithFrame:CGrectMake(0,0 320, 480)];
    [self.view addSubview:scroll];
    // code to init your UI object
    UILabel *uilabel1 = [[UIlabel alloc] initWithFrame:CGrectMake(10,10, 100, 40)]; // example 
    uilabel1.font = [UIFont systemFontOfSize:10];
    uilabel1.text = @"UILabel1";
    uilabel1.backgroundColor = [UIColor clearColor];
    //
    //
    UILabel *uilabel2 = [[UIlabel alloc] initWithFrame:CGrectMake(10, 10 + 10 + uilabel1.frame.origin.y, 100, 40)]; // example
    uilabel2.font = [UIFont systemFontOfSize:10];
    uilabel2.text = @"UILabel2";
    uilabel2.backgroundColor = [UIColor clearColor];
    //
    //
    [scroll addSubview:uilabel1];
    [uilabel1 releale];
    [scroll addSubview:uilabel2];
    [uilabel2 releale];
    //
    //
    // in end 
    float offset = 10.0 * 2; // offset between uiobjects, N - number of objects
    scroll.contentSize = CGSizeMake (0, 0, uilabel1.frame.size.height + uilabel2.frame.size.height + offset, 320);
    

    Обратите внимание, что вы можете установить рамку (и другие свойства) ваших uiobjects и добавить их для спуска.

    07.08.2012
  • Спасибо за ваш ответ .. какие свойства мне нужно установить .. +1 08.08.2012
  • с удовольствием.. я написал не правильно - не свойства, а предпочтения.. может это тень для текста метки... или текст метки (для uilabel), цвет текста, выравнивание текста и т.д. (все, что вы можете установить для IB также можно через код) 08.08.2012
  • вы используете xib (раскадровка) и кодируете оба? Лучше, если вы будете использовать эти вещи отдельно. Вы установили рамку для всех представлений? Вы правильно установили scroll.contentSize? не забудьте добавить к кадру следующего объекта размер предыдущего вида + смещение, как в коде редактирования выше 08.08.2012
  • да, я использую как xib, так и код .. может быть, это проблема .. обновил мой вопрос с кодом, пожалуйста, проверьте его 08.08.2012
  • давайте продолжим это обсуждение в чате 08.08.2012

  • 3

    Вы можете сказать, что следующий вид начинается с конца первого вида, например:

    startYOfNextView = firstView.frame.origin.y position + firstView.frame.size.height;
    

    Сделайте то же самое для остальной части другого вида. Если ваше представление имеет переменную длину текста, вам может потребоваться предварительно вычислить высоту строки на основе определенного шрифта, например:

    CGSize maxSize = CGSizeMake(widthOfView, 9999999);
    CGSize expectedSize = CGSizeMake(stringVar sizeWithFont:[UIFont fontWithName:@"Arial"] withMaxSize:maxSize lineBreakMode:UILineBreakModeWordWrap);
    

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

    myDynamicView = [[UILabel alloc] initWithFrame:CGRectMake(..., expectedSize.height)];
    
    08.08.2012

    4

    Ваша проблема в том, что метки появляются поверх текстового представления (перекрываются), верно?

    В этом случае вы динамически изменяете высоту текстового представления. Если это просто для отображения, вы можете установить текст в UILabel с numberOfLines = 0 вместо UITextview; Поскольку он добавлен в scrollview, добавление метки будет в порядке.

    Также вам нужно изменить origin.y остальных представлений, чтобы они были правильно выровнены. т. е. secondView.origin.y = firstView.origin.y + firstView.size.height + смещение. Аналогичным образом измените происхождение остальных представлений по отношению к представлению чуть выше. Так что его начало будет лежать за пределами предыдущей рамки просмотра.

    08.08.2012

    5

    В моем случае мне пришлось проецировать его на родительский вид, так что помните, что есть еще кое-что,

    - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview
    
    20.12.2019

    6

    Я думаю, что добавление прозрачной кнопки пользовательского интерфейса — самое быстрое решение. Вы можете добавить его один раз, а затем показывать/скрывать всякий раз, когда вам нужно отключить все представления ниже текущего (при условии, что текущее представление, скажем, всплывающее окно, было добавлено последним в ваше суперпредставление).

    Объявите переменную экземпляра UIButton* _parentDisablingOverlay; во всплывающем окне, затем добавьте ее в метод init или layoutSubviews:

    _parentDisablingOverlay = [[UIButton alloc] initWithFrame:CGRectMake(0,0, self.superview.frame.size.width, self.superview.frame.size.height)];
    [self.superview insertSubview:_parentDisablingOverlay belowSubview:self];
    _parentDisablingOverlay.hidden = true;
    

    Позже, когда вы захотите показать всплывающее окно и отключить все ниже:

    - (void) open {
       self.hidden = false;
       _parentDisablingOverlay.hidden = false;
    }
    

    Аналогично, чтобы закрыть и снова включить все:

    - (void) close {
        self.hidden = true;
        _parentDisablingOverlay.hidden = true;
    }
    
    24.07.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..