2015-04-26 4 views
0

У меня есть пользовательский UIView, который автоматически использует автозапуск, чтобы установить размер фрейма. Для этой цели я установить ограничение на ширину свойства зрения, чтобы быть равными, что из надтаблицы, а затем ограничение соотношения сторон, чтобы быть каким-то трудно кодированным значениемКак изменить соотношение сторон UIView

//width constraint 
NSLayoutConstraint *widhtConstraint=[NSLayoutConstraint constraintWithItem:entryView 
                   attribute:NSLayoutAttributeWidth 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:scrollView 
                   attribute:NSLayoutAttributeWidth 
                   multiplier:1.0f 
                    constant:8.0f]; 

[scrollView addConstraint:widhtConstraint]; 

//aspect ratio constraint 
NSLayoutConstraint *aspectRatioConstraint=[NSLayoutConstraint constraintWithItem:entryView 
                     attribute:NSLayoutAttributeWidth 
                     relatedBy:NSLayoutRelationEqual 
                      toItem:entryView 
                     attribute:NSLayoutAttributeHeight 
                     multiplier:80.0/27.0//aspect ratio same as formula view 
                     constant:0.0f]; 

[scrollView addConstraint:aspectRatioConstraint]; 

Пожалуйста, обратитесь изображения:

Constraint setup

Я хочу, чтобы изменить соотношение сторон этого кадра на нажатии кнопки (View More), увеличивая его высоту и потом изменить его обратно на оригинал на коснувшись же button.Additionally как я выясняю общая высота представления, определяемая всеми ее подзонами, так что каждый подсмотр видим без обрезки. (В основном стандартная функция коллапса)

+0

Как я могу манипулировать ограничением соотношения сторон, чтобы он содержал все подзоны под ним? –

+0

Можете ли вы предложить, как бы я мог динамически изменять свойство множителя 'aspectRatioConstraint' (которое в этом случае указывает соотношение сторон представления). Будучи новичком в Autolayout, я тоже ничего не нашел в Интернете. –

ответ

0

Вы можете иметь соотношение сторон как переменную в своем коде и иметь код для установки ограничений в методе, таком как updateConstraints.

float aspectRatio; NSLayoutConstraint *aspectRatioConstraint=[NSLayoutConstraint constraintWithItem:entryView 
                    attribute:NSLayoutAttributeWidth 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:entryView 
                    attribute:NSLayoutAttributeHeight 
                    multiplier:self.aspectRatio//aspect ratio same as formula view 
                    constant:0.0f]; 

Затем при нажатии на кнопку, в способе действий можно изменить self.aspectRatio годным, а затем вызвать setNeedsUpdateConstraints и впоследствии setNeedsLayout.

+0

Извините, но как можно изменить динамическую переменную «aspectRatioConstraint»? Эта переменная просто передается по значению. Там также нет сеттера для «множителя». –

+0

Да, оставленный сам себе он не изменится динамически. Вот почему вам нужно вызвать setNeedsUpdateConstraints, а затем setNeedsLayout. Это приведет к тому, что ограничения будут выполняться снова и выложенное представление. http://stackoverflow.com/a/20927069/1135417 – OutOnAWeekend

0

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

enter image description here

Если это своего рода что вы после этого, вы можете найти загружаемый пример проекта здесь: https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/bk2ch04p183animationAndAutolayout4

+0

В этом примере предлагается изменить ограничение высоты представления, которое не то, что я хочу. Я хочу изменить соотношение сторон таким образом, чтобы представление стало достаточно высоким, чтобы инкапсулировать все подъязыки внутри него (учитывая ширину). –

+0

В примере это именно то, что происходит. Подразделы определяют высоту. – matt

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