Як створити відсоток від загальної ширини за допомогою автоматичного розкладу?


114

Мені потрібно створити три динамічні колонки, кожна з фіксованим відсотком від загальної ширини. Не третини, а різні значення. Наприклад, на наступній ілюстрації показано три колонки: перша - на 42%, друга - на 25%, а третя - на 33%.

Для 600 пікселів у переглядовому контролері це буде 252, 150 та 198 пікселів відповідно.

Однак для будь-яких наступних розмірів дисплея (наприклад, альбом iPhone 4 (ширина 960) або портрет iPad 2 (ширина 768)) я хотів би, щоб відносні відсотки були однаковими (не шириною пікселів, цитованими вище).

Чи є спосіб зробити це за допомогою розкадрувань (тобто без коду)? Я можу це зробити легко в коді, але моя мета полягає в тому, щоб якомога більше цієї логіки дисплея вкласти в Сценарист.

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

Відповіді:


205

Якщо, як ви кажете, ви знаєте, як це зробити в коді, то ви вже знаєте, як це зробити в раскадровці. Це абсолютно ті самі обмеження, але ви створюєте їх візуально, а не в коді.

  1. Виберіть і представлення, і його нагляд.

  2. Виберіть "Редактор" - "Прикріпити -" Ширини. Так само, щоб обмежити ширину, рівну ширині нагляду (насправді найкраще тут працює спливаюче діалогове вікно "шпилька" внизу полотна).

  3. Відредагуйте обмеження та встановіть множник на потрібний дріб, наприклад, 0,42. І так само для інших поглядів.


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

Ага, "роблячи це в коді", я мав на увазі щось на кшталт "вручну, без обмежень і автоматичної розстановки".
Jeffrey Berthiaume

Гарна відповідь. Мене дивує, що IB не надає способу зробити це без редагування обмежень.
wcochran

Я спробував застосувати це у своєму UITableViewCell, і все було сірим. Мені довелося вставити всі свої погляди в новий вид і вибрати Ширину рівномірно від мітки до цього нового представлення. Сподіваюся, це допомагає.
нано

6
Нове в Xcode7: Якщо ви хочете однаково вирівняти представлення даних, використовуйте новий "Перегляд стека".
Біджан

15

Коли Apple представляє UIStackView, це зробило роботу набагато легшою .

Спосіб 1: Використання Nib / StoryBoard:

Вам потрібно просто додати три представлення в програмі інтерфейсів і вставити їх у стек-перегляд

Xcode ► Редактор ► Вставити ► StackView

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

Виберіть stackView та надайте обмеження з провідними, задніми, верхніми та рівними висотами за допомогою SafeArea

Клацніть на Атрибуція області інспектора та встановіть StackView горизонтальну та розподіл, щоб заповнити пропорційно

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

Дайте обмеження на три види з ведучою, нижньою, верхньою, нижньою сторонами відповідної сторони. введіть тут опис зображення

Спосіб 2: Програмно:

import UIKit
class StackViewProgramatically: UIViewController {
    var propotionalStackView: UIStackView!
    ///Initially defining three views
    let redView: UIView = {
        let view = UIView()//taking 42 % initially
        view.frame = CGRect(x: 0, y: 0, width: 42 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .red
        return view
    }()

    let greenView: UIView = {
        let view = UIView()//taking 42* initially
        view.frame = CGRect(x: 42 * UIScreen.main.bounds.width/100, y: 0, width: 25 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .green
        return view
    }()
    let blueView: UIView = {
        let view = UIView()//taking 33*initially
        view.frame = CGRect(x: 67 * UIScreen.main.bounds.width/100, y: 0, width: 33 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .blue
        return view
    }()

    ///Changing UIView frame to supports landscape mode.
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        DispatchQueue.main.async {
            self.redView.frame = CGRect(x: 0, y: 0, width: 42 * self.widthPercent, height: self.screenHeight)
            self.greenView.frame = CGRect(x: 42 * self.widthPercent, y: 0, width: 25 * self.widthPercent, height: self.screenHeight)
            self.blueView.frame = CGRect(x: 67 * self.widthPercent, y: 0, width: 33 * self.widthPercent, height: self.screenHeight)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        //Adding subViews to the stackView
        propotionalStackView = UIStackView()
        propotionalStackView.addSubview(redView)
        propotionalStackView.addSubview(greenView)
        propotionalStackView.addSubview(blueView)
        propotionalStackView.spacing = 0
        ///setting up stackView
        propotionalStackView.axis = .horizontal
        propotionalStackView.distribution = .fillProportionally
        propotionalStackView.alignment = .fill
        view.addSubview(propotionalStackView)
    }
}
//MARK: UIscreen helper extension
extension NSObject {

    var widthPercent: CGFloat {
        return UIScreen.main.bounds.width/100
    }

    var screenHeight: CGFloat {
        return UIScreen.main.bounds.height
    }
}

Вихід:

Працює з пейзажем та портретом

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

Демонстраційний проект - https://github.com/janeshsutharios/UIStackView-with-constraints

https://developer.apple.com/videos/play/wwdc2015/218/


4

Я думаю, що це можна пояснити більш докладно, тому його можна легше застосувати до будь-якої кількості переглядів, що вимагають фіксованих відсоткових макетів у межах огляду.

Найбільше зліва

  • Прив’язаний до SuperView.Leading
  • Визначає його фіксований відсоток як множник на SuperView.Height

Проміжні погляди

  • Визначає його фіксований відсоток як множник на SuperView.Height
  • Шпильками leftправоруч сусіда

Перегляд праворуч

  • Не визначає фіксований відсоток (це залишок доступного перегляду)
  • Шпильками leftправоруч сусіда
  • Прищіпки його rightдоSuperView.Trailing

Усі перегляди

  • Визначте їх нефіксовану висоту, закріпивши до Top Layout Guide.Topі Top Layout Guide.bottom. У відповіді вище зазначається, що це також можна зробити, встановивши рівну висоту сусідньому виду.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.