2013-12-19 2 views
0

Каков наилучший способ расположения элементов друг на друге относительно, где я могу удалить один и все другие элементы вверх. Ниже приведен скриншот элементов, построенных динамически и размещаемых с определенными значениями x и y, но могу ли я просто использовать IB и относить свои элементы относительным образом, и когда я хочу скрыть все, все движется вверх. Также, если бы я хотел сделать это динамически и добавить элементы пользовательского интерфейса, уложенные друг на друга. Мои проблемы ниже - государство/город иногда не существует, и я хочу, чтобы кнопка игры двигалась вверх, когда она скрыта.Позиции Элементы пользовательского интерфейса В IOS Относительно HTML

enter image description here

ответ

2

Вы можете добавить все эти объекты в изменяемом массиве. Задайте объект с помощью цикла for. после каждого приращения цикла приращение значения y объекта объекта с определенным значением. Если один объект не должен отображаться, а затем удалить его из массива и выполнить цикл

array = [NSMutableArray arrayWithObjects:label1,label2,label3,label4]; 
int y = 50; 
for(int i = 0; i<[array count];i++) 
{ 

    [array objectAtIndex:i].frame = CGRectMake(x,y,width,height); 
    [self.view addSubview:[array objectAtIndex:i]]; 
    y = y+50; 

} 
1

Если вы когда-нибудь решите пойти с Auto Layout, вот одно решение.

Ключом к моему подходу является то, что большинство ограничений, которые я создал в IB, являются ограничениями заполнителя; то есть они автоматически удаляются системой во время выполнения. Таким образом, я могу динамически компоновать подзаголовки во время выполнения кода.

Единственного ограничение, созданное в IB, которые не являются заполнителями являются следующим:

  1. ограничения ширины для кнопки игры
  2. ограничения, что по горизонтали центров кнопки игры в надтаблицах

игровая кнопка никогда не удаляется во время выполнения, поэтому вполне можно сохранить эти ограничения во время выполнения.

Если текст ярлыка равен нулю, он удаляется из иерархии вида в viewDidLoad.

enter image description here

enter image description here

#import "ViewController.h" 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UILabel *label1; 
@property (weak, nonatomic) IBOutlet UILabel *label2; 
@property (weak, nonatomic) IBOutlet UILabel *label3; 
@property (weak, nonatomic) IBOutlet UIButton *gamesButton; 

@property (nonatomic, strong) NSMutableArray *viewsStack; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // for testing... 
    //self.label1.text = nil; 
    //self.label2.text = nil; 
    self.label3.text = nil; 

    // build stack of views and remove labels with no text 
    self.viewsStack = [[NSMutableArray alloc] init]; 

    for (UILabel *label in @[self.label1, self.label2, self.label3]) { 

     if (label.text != nil) { 
      [self.viewsStack addObject:label]; 
     } else { 
      [label removeFromSuperview]; 
     } 
    } 

    [self.viewsStack addObject:self.gamesButton]; 

    [self configureConstraintsForViewsStack:self.viewsStack]; 
} 

#define VERTICAL_SPACER 15 

- (void)configureConstraintsForViewsStack:(NSArray *)views 
{ 
    NSString *format = @"V:[topLayoutGuide]"; 
    NSMutableDictionary *viewsDictionary = [[NSMutableDictionary alloc] init]; 
    [viewsDictionary setObject:self.topLayoutGuide forKey:@"topLayoutGuide"]; 

    for (int i = 0; i < [views count]; i++) { 
     format = [format stringByAppendingFormat:@"-spacer-[view%d]", i]; 
     [viewsDictionary setObject:views[i] forKey:[NSString stringWithFormat:@"view%d", i]]; 
    } 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:format options:NSLayoutFormatAlignAllCenterX metrics:@{@"spacer": @(VERTICAL_SPACER)} views:viewsDictionary]]; 
} 
+0

Будет ли это работать без раскадровки. –

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