Otomatik düzen kullanılarak toplam genişliğin yüzdesi nasıl oluşturulur?


114

Her biri toplam genişliğin sabit bir yüzdesine sahip üç dinamik sütun oluşturmam gerekiyor. Üçte bir değil, farklı değerler. Örneğin, aşağıdaki şekilde üç sütun gösterilmektedir: birincisi% 42 genişlikte, ikincisi% 25 genişlikte ve üçüncüsü% 33 genişlikte.

Bir 600 piksel görüntüleme denetleyicisi için, bu sırasıyla 252, 150 ve 198 piksel olacaktır.

Ancak, sonraki ekran boyutları için (ör. İPhone 4 yatay (960 geniş) veya iPad 2 dikey (768 geniş), göreli yüzdelerin aynı olmasını istiyorum (yukarıda belirtilen piksel genişlikleri değil).

Bunu Storyboard kullanarak yapmanın bir yolu var mı (yani kodsuz)? Bunu kodla kolayca yapabilirim, ancak amacım bu görüntüleme mantığının mümkün olduğunca çoğunu Storyboard'a koymak.

görüntü açıklamasını buraya girin

Yanıtlar:


205

Dediğiniz gibi, kodda nasıl yapılacağını biliyorsanız, o zaman film şeridinde nasıl yapılacağını zaten biliyorsunuzdur. Bu tamamen aynı kısıtlamalar, ancak bunları kod yerine görsel olarak oluşturuyorsunuz.

  1. Hem bir görünümü hem de süpervizyonunu seçin.

  2. Genişliği süpervizörün genişliğine eşit olacak şekilde sınırlamak için Düzenleyici -> Sabitle -> Genişlikler'i Eşit Şekilde seçin (aslında tuvalin altındaki "sabitle" açılır iletişim kutusu burada en iyi şekilde çalışır).

  3. Kısıtlamayı düzenleyin ve Çarpanı istenen kesire ayarlayın, örneğin 0.42. Ve diğer görüşler için de.


9
Sınırlandırdığınız görünümün, süpervizör genişliğinin değil, Eşit Genişlikler Kısıtlamasının "ilk öğesinde" göründüğünden emin olun, aksi takdirde alt görünüm genişliğinizi süpervizör genişliğinin katları yaparsınız. Eşit genişlik sınırlaması uygulamak için bir alt görünümden bir denetime sürüklerken, bunlar her zaman tersine çevrilir, bu da bana karşı sezgisel görünüyor.
memmons

Ah - "kodla yapmak" derken daha çok "elle, kısıtlamalar veya otomatik düzen olmaksızın" gibi bir şeyi kastetmiştim.
Jeffrey Berthiaume

Güzel cevap. IB'nin kısıtlamayı düzenlemeden bunu yapmanın bir yolunu sağlamamasına şaşırdım.
wcochran

Bunu UITableViewCell'ime uygulamaya çalıştım ve her şey grileşti. Tüm görünümlerimi yeni bir görünüme yerleştirmem ve bu yeni görünüme etiketimden Eşit Genişliği seçmem gerekiyordu. Umarım yardımcı olur.
nano

6
Xcode7'deki yenilik: Görünümleri eşit şekilde hizalamak istiyorsanız, yeni "Yığın Görünümü" nü kullanın.
Bijan

15

Apple, UIStackView'ı tanıttığında , işi çok kolaylaştırdı.

Yöntem 1: Uç / StoryBoard'u Kullanma:

Arayüz oluşturucuya sadece üç görünüm eklemeniz ve bunları yığın görünümüne yerleştirmeniz gerekir

Xcode ► Düzenleyici ► Yerleştir ► StackView

görüntü açıklamasını buraya girin

SafeArea ile stackView'i seçin ve önde gelen, sondaki, üst ve eşit yükseklik ile kısıtlama verin

Denetçi alanını niteliklendirmek için tıklayın ve StackView yatay ve dağılımını orantılı olarak doldurmak için ayarlayın

[ görüntü açıklamasını buraya girin3

Önde, arkada, üstte, altta yanlara göre üç görünüm kısıtlaması verin. görüntü açıklamasını buraya girin

Yöntem 2: Programlı olarak:

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
    }
}

Çıktı:

Manzara ve portre ile çalışır

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Demo projesi - https://github.com/janeshsutharios/UIStackView-with-constraints

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


4

Sanırım bu daha detaylı bir şekilde açıklanabilir, böylece bir süpervizyon içinde sabit yüzdeli düzenler gerektiren herhangi bir sayıdaki görünüme daha kolay uygulanabilir.

En soldaki görünüm

  • Bağlı SuperView.Leading
  • Sabit yüzdesini, çarpan olarak tanımlar. SuperView.Height

Ara görünümler

  • Sabit yüzdesini, çarpan olarak tanımlar. SuperView.Height
  • Onun iğneler leftkomşusunun sağa

En Sağdaki görünüm

  • Sabit bir yüzde tanımlamaz (mevcut görünümün geri kalanıdır)
  • Onun iğneler leftkomşusunun sağa
  • İğneler onun rightiçinSuperView.Trailing

Tüm Görünümler

  • Demirlemeden ederek Sabit olmayan yüksekliklere tanımlayın Top Layout Guide.Topve Top Layout Guide.bottom. Yukarıdaki cevapta, bunun komşu görünüme eşit yükseklik ayarlanarak da yapılabileceği belirtilmektedir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.