autolayout - зробіть висоту перегляду відносно половини висоти огляду


136

нещодавно потрапляв у автоматичні розклади, і я застряг на тому, що здається справді тривіальним прикладом проблеми. У мене є думка, що я хочу сидіти вгорі екрана і займати половину висоти екрана. Простий перед автоматичним розгортанням - просто встановіть його на місці та скажіть, щоб він розширився вертикально, коли розмір нагляду буде змінено.

Тепер я не можу все життя бачити, як це зробити. Ось що я отримую, коли намагаюся налаштувати це:

автолаутер блюз

Обмеження нижнього простору встановлено на "дорівнює 284", що для мене абсолютно і абсолютно марно, коли я переходжу на iPhone4 макет, оскільки він зберігає 284 точкових місця в нижній частині екрана і скорочує вигляд, щоб він більше не був половиною розмір екрана. І немає можливості встановити це обмеження, яке дорівнює деякій частці висоти будь-якого іншого виду ..

Пробуючи певний час, єдиним способом, який я можу зробити це, було б ввести інший вигляд під цим видом, однаково закріпити їх висоту, дозволити їм сидіти вище та нижче один одного, а потім встановити другий (нижній) вигляд невидимим .. що здається трохи некрасивим!

Я пропускаю щось очевидне? ..


1
Я не думаю, що це некрасиво, але розумна хитрість отримати те, що ви хочете, використовуючи IB. Я це зробив, і коли ви використовуєте власні імена елементів, ви можете зрозуміти, що відбувається. Ви можете навіть мати третій елемент на іншій позиції або змінити розмір у центрі, виходячи з цих двох підвидів.
Jelle

Відповіді:


167

Зараз це можливо в ІБ (як мінімум) Xcode 5.1.1. Хоча мені знадобилося колись зрозуміти, що насправді це дуже просто:

Спочатку створіть базове обмеження для вирівнювання у верхньому (вам також знадобиться встановити обмеження на нижній, лівий та правий, як звичайний). Потім виберіть обмеження та перейдіть до інспектора атрибутів :

Демонстрація етапів вище

Потім можна відрегулювати множник. Якщо ви хочете, щоб це було 50% від виду супер, залиште його 1, оскільки він вирівняний по центру супер. Це також чудовий спосіб створити представлення даних, які теж є іншими відсотками (наприклад, 25% від перегляду)

Демонстрація другого кроку вище


приємно :) Я думаю, що цю публікацію слід позначати як прийняту відповідь :) Розробник iOS часто віддає перевагу рішення для розробників інтерфейсів, а не подібне до коду рішення
hqt

@hqt, спасибі Я думаю, що коли була прийнята відповідь, цей метод був недоступний. Іноді запитуючі не переглядають старі запитання або не хочуть змінити прийняту відповідь. Але врешті-решт я просто тут, щоб допомогти, радий, що це зробилося!
Фіро

3
Я трохи розгублений. Я спробував це, але він просто зосереджує погляд на огляді, він не регулює висоту подання.
Декан

@Dean, вам потрібно переконатися, що First Itemце View.Topне так View.Center Y. В іншому випадку, так, це буде просто центром. Вам також потрібно переконатися, що інші обмеження встановлені належним чином, щоб обробляти інші краї подання.
Фіро

1
View.Top дорівнює Superview.Center Y множник 1 не дає висоти. Ця відповідь неповна. Все, що вам потрібно зробити, - це подумати над тим, що ви говорите, і ви можете бачити, що це дає вам лінію через центр! Я би відредагував цю відповідь, щоб було зрозуміло, про які інші обмеження ви говорите.
усмішкаБот

184

Рішення для розкадрування, де ви можете встановити точне співвідношення між будь-якими переглядами:

Встановити обмеження рівності висоти

Зараз:

Редагувати множник обмеження

ПРИБУТ !!!

Результат

PS Також зауважте, що цей метод працює з видами на різні рівні гніздування та (очевидно), застосовними для ширини

PPS іноді може бути корисним "перевернути перший і другий елемент" обмеження або встановити зворотний множник (наприклад, 2 замість 0,5) (але ці методи не корисні, якщо ви не розумієте, як погляди стосуються один одного).


1
Крок 2, схоже, не працює для мене. Я не можу вибрати нічого на панелі, крім включення "Обмеження до поля". Я намагаюся встановити ширину UIImageView в UITableViewCell до 50% від перегляду вмісту.
DrMickeyLauer

2
ОНОВЛЕННЯ: Очевидно, що конструктор інтерфейсів не дозволяє перегляду вмісту бути явною ціллю будь-яких обмежень щодо автоматичного макета. Я маю вставити фіктивний підрозділ як дочірній вигляд вмісту, щоб зробити цю роботу.
DrMickeyLauer

1
Це працює для мене. Вам потрібно вибрати два перегляди у списку, а не на екрані розробника. для відсотків розділити менший вид на більший вид, щоб отримати приклад значення множника, менший вид 25, більший вид 135 - 25/135 = 0,185. Встановіть це як значення множника, щоб отримати уявлення про те, що при x1 та x2 = 25, але збільшується з більшими 6 і 6 плюс тощо
latenitecoder

1
Це працювало для мене, але зауважте, що мені довелося також додати три обмеження, які встановлюють обмеження межі підгляду в 0. Дякую
raddevus

Це має бути прийнятою відповіддю. Спершу спробую прийняти відповідь. Це не спрацювало, тоді я прокрутився вниз, і я побачив цю відповідь, і вона спрацювала. Дякую!
Міхір Оза

31

Через трохи більше часу я придумав наступне.

Я відзначаю це як відповідь, але це не дуже задовольняє, оскільки передбачає, що ви насправді цього не можете зробити в Interface Builder, але правильне обмеження може бути додано в код згодом як:

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}

В основному, він встановлює множник 0,5 проти висоти самоперегляду, діючи на верхній вигляд. Мені довелося встановити пріоритет нижнього вертикального обмеження простору в IB нижчим за 1000, щоб уникнути ще й безлічі повідомлень часу виконання про порушення обмежень.

Отже, якщо хтось може показати, як це зробити в Interface Builder, це краще відповість на моє запитання, інакше я думаю, це так добре, як це стає (поки що) ???


3
Я думаю, що це так добре, як зараз. Було б непогано, якби Apple дала нам доступ до значення множника в IB, так що це може бути встановлено так само, як і константа.
rdelmar

3
Для всіх, хто дивиться на цю відповідь, Xcode 5.1 тепер дозволяє встановити множник через Interface Builder. Тепер я можу налаштувати представлення даних, що вдвічі перевищує їхній огляд через IB.
Марк Кренек

9

Трохи легше і прямолінійніше, ніж метод, ніж відповідь Федора Волчека. -Утримуйте кнопку керування та натисніть на підзагляд. -Перетримавши натиснутою на командній кнопці, перетягніть курсор до набору, а потім натисніть на перегляд. -Виберіть "Співвідношення сторін".

введіть тут опис зображення

-Щоб потім натисніть Інспектор розміру. - Потім двічі клацніть на обмеження. введіть тут опис зображення

-Упевніться, що для обох елементів вибрано "висоту". введіть тут опис зображення

- Потім змініть "Множник" на 0,5 на половину екрана, або будь-яку частину від перегляду, який ви хочете. введіть тут опис зображення


Легкий та швидкий підхід! Спасибі товариш
Абдулла Саїд

7

У мене також є інша можливість у коді, якщо у вас є 2 представлення, які повинні мати однакову висоту: просто встановіть висоту view2 до висоти view1 (фокус тут не в тому, щоб встановлювати висоту view1 чітко).

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];

Не розуміли, що ви можете посилатися на інші погляди на такі ширини / висоти. Це найясніша відповідь IMO, якщо ви вже використовуєте мову візуального формату.
loeschg

Приклад @brainray також пояснюється на developer.apple.com тут
alecs.popa

0

Швидка версія відповіді Мете:

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



    upperView.translatesAutoresizingMaskIntoConstraints = false


    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.