iPhone - менеджер раскладок для UIViews? - PullRequest
6 голосов
/ 05 февраля 2010

Я не уверен, является ли термин "менеджер компоновки" правильным термином, но я ищу способ заставить UIViews перетекать в родительское представление своего уровня, как в случае с левосторонним элементом div на странице HTML. Есть ли простой способ сделать это, через API для iPhone или что-то внешнее?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2010

После некоторого поиска я нашел это: http://code.google.com/p/layoutmanagers/ Последняя разработка была в декабре 2009 года, но на первый взгляд кажется, что она все еще применима к текущим версиям iOS.

1 голос
/ 08 июля 2012

Вот полное решение (на основе ответа Джо Каннатти ):

  1. Добавьте UIView к вашей раскадровке и свяжите его с вашим ViewController под некоторым именем, например, container. (Если ваш контейнерный вид представляет собой весь вид, вы можете использовать self.view вместо container в вашем ViewController.m.)

  2. Создание и добавление элементов пользовательского интерфейса в container. Например, вы можете создать и добавить UILabel к container с помощью:

    UILabel* label = [[UILabel alloc] init];
    label.text = @"Foo";
    [label sizeToFit];
    [container addSubview:label];
    
  3. Первоначально и всякий раз, когда вы добавляете / удаляете / изменяете элементы пользовательского интерфейса в / из / внутри container, вы можете переупорядочивать их в макет потока с помощью:

    float x = 0, y = 0, width = container.frame.size.width, rowHeight = 0;
    for (UIView* view in container.subviews) {
      // only re-arrange user-added views (change condition as required)
      if (![view isKindOfClass:UILabel.class]) continue;
      float w = view.frame.size.width, h = view.frame.size.height;
      bool fitsInRow = x + w <= width;
      if (!fitsInRow) {x = 0; y += rowHeight; rowHeight = h;}
      view.frame = CGRectMake(x, y, w, h);
      x += w;
      rowHeight = MAX(rowHeight, h);
    }
    // if container is a UIScrollView, change content size
    container.contentSize = CGSizeMake(width, y + rowHeight);
    
1 голос
/ 05 февраля 2010

Нет ничего похожего на это встраивание в SDK, но не должно быть слишком сложно, чтобы получить поведение, которое вы после. Просто позвоните

NSArray *subs = [parentView subviews];

, чтобы получить все присутствующие подпредставления. Пролистайте их вот так

CGRect leftMostViewsFrame = nil;
for(UIView *cur in subs){
  CGRect where = cur.frame;
  //find the left most frame for a given X coord
}

и разместите новый вид рядом с ним

newView.frame = CGRectMake(leftMostViewsFrame.origin.x + leftMostViewsFrame.size.width, 
[parentView addSubview:newView];

......

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

0 голосов
/ 05 февраля 2010

Я не знаю API для этого. Базовая анимация на Mac имеет некоторые элементы макета, но я думаю, что она не была включена в iPhone.

То, что вы описываете, звучит не очень сложно, хотя. С открытым исходным кодом это? : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...