2013-10-07 2 views
1

У меня есть два UIView s, скажем containerView и testView. Скажем, что ширина testView больше, чем у containerView. В таком случае, когда я добавляю testView как подпункт containerView, возникает моя проблема. Кадры testView выходят за рамки containerView. Вот мой код -Изменить размер UIView

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

    UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(60, 154, 200, 200)]; 
    containerView.backgroundColor = [UIColor grayColor]; 
    containerView.clipsToBounds = NO; 

    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 100)]; 
    testView.backgroundColor = [UIColor yellowColor]; 
    testView.layer.borderWidth = 3; 
    testView.layer.borderColor = [[UIColor blackColor] CGColor]; 
    testView.center = CGPointMake(containerView.frame.size.width/2, containerView.frame.size.height/2); 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 25, 230, 50)]; 
    label.text = @"This is a Label to test the size"; 

    [testView addSubview:label]; 
    [containerView addSubview:testView]; 
    [self.view addSubview:containerView]; 
} 

Выход на этот код - enter image description here

Когда containerView.clipsToBounds = YES;, выход - enter image description here

Но что я точно нужно - enter image description here (Отредактированное изображение)

Когда я добавляю testView, ширина/высота которого больше его супервизора containerView, рамка testView (включая детей) должна быть отрегулирована так, чтобы она идеально вписывалась в ее супервизор.

Я приветствую ваши идеи ..!

+0

вы устанавливаете каждый раз руководство пользователя размером testView? откуда они? –

+0

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

+0

@Bala: Я запускаю Xcode 5.0, iOS7. Это касается версии? – iOS

ответ

4

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

Таким образом, вы не будете возиться с кадрами, а изменение размера с поворотом будет обработано для вас.

Edited добавить

Вот несколько примеров кода, чтобы сделать что-то подобное тому, что вы просите

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Create the containing view 
    UIView *greyView = [[UIView alloc] initWithFrame:CGRectZero]; 
    greyView.backgroundColor = [UIColor grayColor]; 
    greyView.translatesAutoresizingMaskIntoConstraints = NO; 

    [self.view addSubview:greyView]; 

    // Create the label to go into the containing view 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; 
    label.translatesAutoresizingMaskIntoConstraints = NO; 
    label.text = @"Example Text"; 

    label.backgroundColor = [UIColor yellowColor]; 

    [greyView addSubview:label]; 

    NSDictionary *bindings = NSDictionaryOfVariableBindings(greyView, label); 

    // Set the constraints for the greyView relative to it's superview - to cover completely 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[greyView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:bindings]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[greyView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:bindings]]; 

    // Set the constraints for the label to be pinned equally with padding 
    [greyView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(30)-[label]-(30)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:bindings]]; 
    [greyView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(30)-[label]-(30)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:bindings]]; 

} 

Если вы хотите, чтобы увидеть его в действии и настроить ограничения себя, я Вы загрузили simple example project, который вы можете использовать.

+0

Hi Abizem. Кажется, я должен достичь этого, используя только ограничения. У меня нет опыта в использовании ограничений. Я попытался с некоторыми формулами и потерпел неудачу. Как я могу создать формулу для этой потребности? – iOS

+0

Я пробовал много на один день. Мой результат - только белый экран каждый раз. Рамка containerView и testView становится равным нулю после добавления противопоказаний. – iOS

+0

Вы уверены, что добавляете ограничения правильно? вам нужно добавить ограничения для представления контейнера в супервизор, а также ограничения для метки. Вот подсказка - не используйте containerView как имя - он имеет определенное значение при работе с Xcode и Storyboards. – Abizern

0

Почему вы устанавливаете ширину вашего тестового экрана (желтого) больше, чем его контейнер, и жалуетесь, что он больше? Вы должны просто сделать

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(60, 154, 200, 200)]; 
[...] 
UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 180, 100)]; // 180 not 260 
[...] 
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 25, 150, 50)]; // 150 not 230 

Или используйте автоматический макет, как предложено.

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