Interface Builder: ce este, design vizual în Xcode și storyboard-uri

Autor: IT Sectr Publicat: 2026-02-12 Timp de citire: 15 min

Interface Builder — un editor vizual de interfețe integrat în Xcode pentru dezvoltarea iOS și macOS. Permite crearea UI prin drag-and-drop, configurarea Auto Layout, conectarea codului prin IBOutlet și IBAction. Vom analiza cum funcționează IB, diferențele dintre Storyboard și XIB și la ce servesc @IBDesignable.

Principalele idei

  • Interface Builder — editor vizual în Xcode pentru interfețe UIKit fără a scrie cod de layout
  • Storyboard descrie mai multe ecrane și tranzițiile dintre ele; XIB — un singur component sau ecran
  • Auto Layout în IB stabilește constrângeri prin meniurile Pin, Align și Resolve Issues
  • IBOutlet și IBAction leagă codul Swift de elementele UI prin Ctrl+drag
  • @IBDesignable și @IBInspectable afișează vizualizări personalizate direct pe plansa IB

Ce este Interface Builder?

Interface Builder — o componentă Xcode destinată proiectării vizuale a interfețelor de utilizator. Istoria IB a început în 1988 la compania NeXT, cu mult înainte de apariția iOS. Stefan Pope a dezvoltat prima versiune pentru NeXTSTEP — sistemul de operare care a stat la baza macOS și iOS. În 1996, Apple a achiziționat NeXT și a integrat Interface Builder în Xcode.

În Xcode modern, Interface Builder suportă trei formate de fișiere: Storyboard, XIB (Xcode Interface Builder) și fișiere XIB pentru celule de tabel și vizualizări personalizate. Fiecare dintre aceste formate stochează descrierea XML a ierarhiei elementelor UI, proprietățile lor, constrângerile și conexiunile cu codul.

IB funcționează la nivelul UIKit: butoane, etichete, câmpuri de text, tabele, colecții și constrângeri sunt trase cu mouse-ul pe plansă. Xcode compilează fișierele .storyboard și .xib în arhive nib (compiled Interface Builder) în faza de build, ceea ce reduce dimensiunea pachetului și accelerează încărcarea.

Potrivit Apple, peste 70% din proiectele iOS pe UIKit folosesc Interface Builder în diferite etape de dezvoltare. În ciuda creșterii SwiftUI, IB rămâne standardul pentru aplicațiile comerciale cu suport pentru iOS 12 și mai vechi, precum și pentru interfețe personalizate complexe care necesită reglarea fină a Auto Layout.

Cum a ajuns Interface Builder în Xcode

Înainte de Xcode 4, Interface Builder era o aplicație separată, rulată în paralel cu editorul de cod. În Xcode 4 (2011), Apple a unit IB și editorul de cod într-un singur IDE. Acest lucru a permis comutarea între cod și layout fără a schimba ferestrele, precum și vizualizarea modificărilor proprietăților în timp real prin panoul Attributes Inspector.

Versiunea XcodeAnulModificări în Interface Builder
Xcode 32008IB — aplicație separată, suport iOS 2.0
Xcode 42011IB integrat în IDE, au apărut Storyboard
Xcode 52013Auto Layout cu meniu de constrângeri, previzualizare ecrane
Xcode 62014Size Classes, @IBDesignable, Preview Assistant
Xcode 112019SwiftUI Canvas, IB rămâne pentru UIKit
Xcode 152023SwiftUI Preview ca instrument principal, mod legacy IB

Odată cu apariția SwiftUI în 2019, Apple a mutat accentul pe dezvoltarea declarativă, însă Interface Builder rămâne integrat în Xcode pentru suportul proiectelor UIKit. Mii de aplicații existente continuă să folosească IB, iar Apple nu a anunțat eliminarea sa.

Storyboard și XIB: formatele fișierelor IB

Interface Builder suportă două formate principale: Storyboard (.storyboard) și XIB (.xib). Diferența dintre ele constă în domeniul de vizibilitate și scenariul de utilizare.

Storyboard — un fișier care conține întreaga scenă a aplicației: mai multe ecrane (UIViewController), tranziții între ele (segues), controlere de navigare, tab-bar-uri și toate elementele UI. Storyboard se încarcă o singură dată la pornire din Info.plist prin cheia UIMainStoryboardFile (k). Este convenabil pentru vizualizarea fluxului ecranelor, dar creează probleme la conflictele de merge în git, deoarece descrierea XML a întregii aplicații este stocată într-un singur fișier.

XIB (prescurtare de la Xcode Interface Builder) — un fișier pentru un singur component: un UIView separat, UITableViewCell, UICollectionViewCell sau un singur ViewController. XIB se încarcă la cerere prin UINib(nibName:bundle:) (k) sau metoda Bundle.loadNibNamed (k). Fișierele XIB sunt mai ușor de meritat, sunt mai compacte și se încarcă mai repede, deoarece nu conțin descrierea întregii aplicații.

CriteriuStoryboardXIB
DomeniuMai multe ecrane + tranzițiiUn ecran sau component
SeguesSuportă (push, modal, unwind)Nu suportă
Merge în gitDificil (un XML mare)Simplu (multe fișiere mici)
ÎncărcareLa pornirea aplicațieiLa cerere (leneșă)
ReutilizareDoar prin storyboard referencesRidicată (celule, header-e, view-uri)
Recomandarea AppleNerecomandat pentru proiecte mariRecomandat pentru componente

Începând cu Xcode 11, Apple recomandă utilizarea XIB pentru componente individuale și evitarea Storyboard-urilor monolitice. Pentru navigarea între ecrane, se preferă navigarea prin cod cu UIStoryboardSegue (k) manual sau coordonatori.

Structura XML în fișierele IB

Fișierele .storyboard și .xib stochează XML în formatul Interface Builder Cocoa Touch XIB (dt). Exemplu de structură simplificată:

xml
<!-- Fișier XIB cu UIView și UILabel -->
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB"
          version="3.0">
  <objects>
    <view id="abc-123"
          userLabel="CustomHeaderView"
          contentMode="scaleToFill">
      <subviews>
        <label id="def-456"
               text="Titlu"
               textColor="darkTextColor"
               fontDescription="title1"/>
      </subviews>
    </view>
  </objects>
</document>

Fiecare element are un id (an) unic prin care IB leagă nodul XML de obiectul runtime. La compilare, Xcode transformă XML-ul în format binar nib (.nib), reducând dimensiunea fișierului cu aproximativ 40%.

Auto Layout și Size Classes în Interface Builder

Auto Layout — sistem de poziționare a elementelor pe ecran prin relații matematice (constrângeri). Interface Builder oferă o interfață vizuală pentru crearea, editarea și depanarea constrângerilor fără a scrie cod. Fiecare constrângere descrie o dependență: view.leading = superview.leading + 16 (k) sau view.width = 2 * otherView.height (k).

În IB, constrângerile se creează prin meniurile Pin (fixarea spațierilor, lățimii, înălțimii) și Align (alinierea la centru, margini, baseline). Panoul Size Inspector afișează toate constrângerile elementului selectat, prioritățile lor (required/high/low) și permite editarea multiplicatorilor și constantelor.

IB suportă și UIStackView — un container care gestionează automat aranjarea vizualizărilor copil. Este suficient să plasați elementele într-un stack view pe plansă, iar IB va genera automat constrângerile necesare. Acest lucru accelerează semnificativ layout-ul în comparație cu aranjarea manuală a constrângerilor.

Size Classes: adaptarea la dispozitive

Size Classes — o abstractizare care grupează dispozitivele după lățimea și înălțimea ecranului: Compact și Regular. Combinațiile (wC hR pentru iPhone portret, wR hR pentru iPad) permit stabilirea unor constrângeri și aranjamente diferite pentru diferite scenarii. În Interface Builder, comutarea între size classes schimbă setul de constrângeri active pe plansă.

DispozitivOrientareWidth ClassHeight Class
iPhone (cu excepția Max/Plus)PortretCompactRegular
iPhone (cu excepția Max/Plus)PeisajCompactCompact
iPhone Plus/MaxPeisajRegularCompact
iPadOricareRegularRegular
iPad Split View1/3 ecranCompactRegular

Exemplu de constrângere cu variație după size class:

swift
import UIKit

class AdaptiveViewController: UIViewController {

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var leadingConstraint: NSLayoutConstraint!

    private func updateConstraints() {
        let isRegular = traitCollection.horizontalSizeClass == .regular
        leadingConstraint.constant = isRegular ? 40 : 16
        titleLabel.font = isRegular
            ? UIFont.preferredFont(forTextStyle: .largeTitle)
            : UIFont.preferredFont(forTextStyle: .title1)
    }

    override func traitCollectionDidChange(
        _ previousTraitCollection: UITraitCollection?
    ) {
        super.traitCollectionDidChange(previousTraitCollection)
        if traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass {
            updateConstraints()
        }
    }
}

În codul de mai sus, traitCollectionDidChange reacționează la schimbarea size class, actualizând constrângerea și fontul. Interface Builder permite setarea valorilor implicite pentru fiecare size class prin inspector, iar codul este folosit pentru scenarii dinamice care nu pot fi descrise static.

IBOutlet, IBAction și legătura codului cu UI

Legătura dintre interfața vizuală din Interface Builder și codul Swift/Objective-C se realizează prin două mecanisme: IBOutlet (Interface Builder Outlet) și IBAction (Interface Builder Action). Ambele se creează prin tragere cu tasta Ctrl apăsată din plansa IB în fișierul controlerului.

IBOutlet — o adnotare care declară o referință către un element UI. Xcode o conectează automat la obiectul corespunzător din arhiva nib la încărcare. Dacă conexiunea se rupe (de exemplu, elementul a fost redenumit), aplicația se prăbușește cu eroarea NSUnknownKeyException (k). IBOutlet este marcat ca weak (k), deoarece nib deține obiectul, iar controlerul este doar un observator.

IBAction — o metodă apelată la un eveniment al elementului UI: apăsarea unui buton, modificarea textului, comutarea unui switch. IB leagă UIControlEvent (k) de metodă prin addTarget:action:forControlEvents: (k). În cod, IBAction arată ca o metodă obișnuită cu tipul de returnare IBAction (dt).

swift
import UIKit

final class LoginViewController: UIViewController {

    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var loginButton: UIButton!
    @IBOutlet weak var spinner: UIActivityIndicatorView!

    @IBAction private func loginButtonTapped(_ sender: UIButton) {
        guard let email = emailTextField.text, !email.isEmpty,
              let password = passwordTextField.text, !password.isEmpty
        else {
            showAlert(message: "Completați toate câmpurile")
            return
        }
        loginButton.isEnabled = false
        spinner.startAnimating()
        performLogin(email: email, password: password)
    }

    private func performLogin(email: String, password: String) {
        /// Apel API prin URLSession
        let request = LoginRequest(email: email, password: password)
        APIClient.shared.login(request) { [weak self] result in
            DispatchQueue.main.async {
                guard let self else { return }
                self.spinner.stopAnimating()
                self.loginButton.isEnabled = true
                switch result {
                case .success:
                    self.navigateToMainScreen()
                case .failure(let error):
                    self.showAlert(message: error.localizedDescription)
                }
            }
        }
    }

    private func showAlert(message: String) {
        let alert = UIAlertController(
            title: "Eroare",
            message: message,
            preferredStyle: .alert
        )
        alert.addAction(UIAlertAction(title: "OK", style: .default))
        present(alert, animated: true)
    }
}

Exemplul prezintă o legătură standard: IBOutlet pentru câmpuri de text, buton și spinner, IBAction pentru gestionarea apăsării. Toate aceste conexiuni se stabilesc în Interface Builder prin Ctrl+drag. Dacă conexiunea nu este configurată, IBOutlet va fi nil (v) la runtime, ceea ce va provoca un crash la accesare — de aceea IBOutlet este declarat ca weak var (k s) cu implicit unwrap.

@IBDesignable și @IBInspectable: componente personalizate

@IBDesignable — o adnotare Swift care permite afișarea unui UIView personalizat direct pe plansa Interface Builder în timp real. Dezvoltatorul vede rezultatul modificărilor de cod fără a rula aplicația. @IBInspectable — o adnotare pentru proprietăți care le adaugă în panoul Attributes Inspector IB, unde valorile pot fi modificate interactiv.

Aceste adnotări sunt deosebit de utile la crearea bibliotecilor de componente UI: butoane personalizate, câmpuri de intrare cu mască, indicatoare animate. IBDesignable folosește prepareForInterfaceBuilder() (fn) pentru compilarea separată a codului de build, care nu afectează binarul principal al aplicației.

swift
import UIKit

@IBDesignable
final class GradientButton: UIButton {

    @IBInspectable var startColor: UIColor = .systemBlue {
        didSet { updateGradient() }
    }

    @IBInspectable var endColor: UIColor = .systemPurple {
        didSet { updateGradient() }
    }

    @IBInspectable var cornerRadius: CGFloat = 12 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = true
        }
    }

    private let gradientLayer = CAGradientLayer()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupGradient()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupGradient()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        gradientLayer.frame = bounds
    }

    private func setupGradient() {
        layer.insertSublayer(gradientLayer, at: 0)
        updateGradient()
    }

    private func updateGradient() {
        gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
        gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
        gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setupGradient()
    }
}

În codul de mai sus, GradientButton este o componentă IBDesignable cu proprietăți IBInspectable startColor (v), endColor (v) și cornerRadius (v). La tragerea unui UIView pe plansa IB și schimbarea clasei în GradientButton în Identity Inspector, pe plansă se va afișa un buton cu gradient în timp real. Toate proprietățile IBInspectable vor apărea în panoul Attributes Inspector din dreapta.

Important: @IBDesignable compilează codul integral pentru afișarea în IB, deci nu trebuie să execute cereri de rețea sau operații lungi. Pentru diferențiere se folosește #if TARGET_INTERFACE_BUILDER (k) — compilare condiționată care exclude codul ne destinat pentru IB.

Ciclul de viață al fișierelor IB la compilare

Procesul de transformare a fișierelor Interface Builder de la crearea nib până la afișarea pe ecran include mai multe etape. Înțelegerea acestui ciclu ajută la diagnosticarea problemelor cu IB.

În faza de build, Xcode lansează instrumentul ibtool (k, fn) — o utilitate de linie de comandă pentru compilarea fișierelor .storyboard și .xib în format binar nib. ibtool efectuează și validarea: verifică corectitudinea constrângerilor, existența tuturor claselor, tipurile conexiunilor IBOutlet/IBAction. Erorile de validare sunt afișate în Issue Navigator Xcode.

Arhiva finală .nib este plasată în pachetul aplicației în folderul .nib (s). Dimensiunea fișierului nib este semnificativ mai mică decât XML-ul original: formatul binar folosește o reprezentare optimizată cu înlocuirea șirurilor cu token-uri și compresia valorilor numerice. Compresia tipică este de 50–60% din dimensiunea XML-ului original.

La runtime, nib se încarcă prin UINib(nibName:bundle:) (k) sau automat prin UIStoryboard.instantiateViewController(withIdentifier:) (k). Procesul de încărcare include:

  • Deserializarea nib-ului binar într-un graf de obiecte Objective-C/Swift
  • Crearea instanțelor tuturor elementelor UI din arhivă
  • Restabilirea conexiunilor IBOutlet și IBAction (outletCollection pentru grupuri)
  • Aplicarea constrângerilor Auto Layout din arhivă cu luarea în considerare a size class
  • Apelarea awakeFromNib() (fn) pentru fiecare obiect — punct de intrare pentru configurarea post-încărcare

Metoda awakeFromNib() (fn) este apelată după ce toate IBOutlet au fost stabilite, dar înainte de primul layoutSubviews. Este convenabilă pentru configurarea inițială: setarea rotunjirilor, adăugarea umbrelor, localizarea textului. Cu toate acestea, toate IBOutlet sunt garantat non-nil în awakeFromNib.

Interface Builder versus SwiftUI Preview

Odată cu lansarea SwiftUI în 2019, dezvoltatorii iOS au primit o alternativă la Interface Builder — un framework declarativ cu Canvas Preview în timp real. Să analizăm diferențele cheie dintre cele două abordări.

Interface Builder generează o descriere XML care este compilată în nib. Interfața este creată vizual, codul răspunde doar de logică. IB necesită un prag de intrare mai scăzut pentru designeri fără abilități de programare, dar este dificil în revizuirea codului (modificările XML nu sunt vizibile în diff).

SwiftUI Preview — dezvoltare complet bazată pe cod. Interfața este descrisă în Swift, previzualizarea se actualizează la fiecare salvare. Nu există XML, nu există nib, nu există riscul ruperii conexiunilor IBOutlet. SwiftUI Preview funcționează mai rapid decât IB, deoarece nu necesită compilarea unui fișier separat.

CriteriuInterface Builder (UIKit)SwiftUI Preview
Format fișierXML (.storyboard / .xib) → nib binarCod Swift (fără fișier intermediar)
PrevizualizarePlansa IB cu întârziere la vizualizări complexeCanvas Preview în timp real
Suport versiuni iOSiOS 2.0+ (toate versiunile)iOS 13+
Merge în gitProblematic (un fișier XML)Simplu (cod Swift obișnuit)
Date dinamicePrin IBOutlet + cod@State (k), @Observable (k)
Vizualizări personalizate@IBDesignable (compilare)SwiftUI View cu PreviewProvider
PerformanțăÎncărcare rapidă nibCompilare Swift la fața locului

În practică, alegerea între IB și SwiftUI Preview depinde de cerințele proiectului. Interface Builder este de neînlocuit pentru aplicațiile UIKit cu suport pentru iOS vechi, precum și pentru proiectele comerciale în care designerii lucrează în Xcode fără cunoștințe de Swift. SwiftUI este preferat pentru proiectele noi orientate spre iOS 17+, unde viteza de dezvoltare și reactivitatea contează.

Apple nu intenționează să elimine Interface Builder din Xcode. Mai mult, în Xcode 16, compania a îmbunătățit performanța planșei IB și a adăugat suport pentru componente SwiftUI prin puntea UIViewRepresentable. Se estimează că IB va fi suportat cel puțin până în 2030.

Cele mai bune practici de lucru cu Interface Builder

Ani de experiență în dezvoltarea iOS au format un set de recomandări care reduc numărul de probleme la utilizarea Interface Builder în proiecte comerciale.

Folosiți XIB în loc de Storyboard pentru componente reutilizabile. Fiecare celulă de tabel personalizată, header sau footer trebuie să fie într-un XIB separat. Acest lucru ușurează merge-ul, accelerează încărcarea și permite reutilizarea componentelor între proiecte prin Swift Package Manager sau CocoaPods.

Configurați Storyboard References pentru împărțirea storyboard-urilor mari în module. În loc de un singur Main.storyboard cu 100 de ecrane, creați câte un storyboard pentru fiecare modul (Auth, Profile, Feed) și conectați-le prin Storyboard Reference. Aceasta va reduce timpul de compilare ibtool și va simplifica munca în echipă.

Evitați conexiunile IBOutlet la File's Owner (k) fără verificare. Fiecare conexiune trebuie să fie weak (k) și opțională (implicitly unwrapped optional este minunat doar în playground). La redenumirea IBOutlet într-o vizualizare, Xcode actualizează automat conexiunea, dar la editarea manuală a XML-ului este ușor să faceți o greșeală.

  • Verificați întotdeauna Show Connection Panel (k) după editarea fișierului IB — indicatoarele roșii semnalează conexiuni întrerupte
  • Folosiți User Defined Runtime Attributes (k) pentru setarea proprietăților fără cod: layer.cornerRadius, layer.borderWidth, tintColor
  • Grupați constrângerile în IB după destinație: constrângeri pentru dimensiuni, constrângeri pentru spațieri, constrângeri pentru proporții
  • Atribuiți un Identifier (k) fiecărei constrângeri în Size Inspector — ajută la depanarea conflictelor
  • Nu plasați logică de business în awakeFromNib — doar configurare UI. Logica — în viewDidLoad sau servicii separate
swift
import UIKit

final class ProfileHeaderView: UIView {

    @IBOutlet weak var avatarImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var bioLabel: UILabel!
    @IBOutlet weak var editButton: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
        avatarImageView.layer.cornerRadius = avatarImageView.bounds.width / 2
        avatarImageView.layer.masksToBounds = true
        nameLabel.font = UIFont.preferredFont(forTextStyle: .headline)
        bioLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
    }

    func configure(with profile: UserProfile) {
        nameLabel.text = profile.fullName
        bioLabel.text = profile.bio
        /// Încărcare avatar prin SDWebImage sau Kingfisher
    }

    static func instantiateFromNib() -> ProfileHeaderView {
        let nib = UINib(nibName: String(describing: self), bundle: nil)
        return nib.instantiate(withOwner: nil).first as! ProfileHeaderView
    }
}

Exemplul prezintă o best practice pentru o vizualizare XIB: metoda statică instantiateFromNib (fn) încarcă vizualizarea din XIB cu același nume ca și clasa. Metoda awakeFromNib (fn) configurează UI (rotunjiri, fonturi), iar metoda configure(with:) (fn) primește un model de date pentru completare. Separarea responsabilităților ușurează testarea și reutilizarea.

Întrebări frecvente

Cu ce se deosebește Interface Builder de SwiftUI Preview?

Interface Builder — un editor vizual pentru UIKit cu format Storyboard/XIB, care funcționează prin drag-and-drop. SwiftUI Preview — o previzualizare declarativă în timp real, unde interfața este descrisă prin cod Swift. Ambele instrumente sunt integrate în Xcode, dar IB generează XML, iar SwiftUI compilează Swift direct. IB suportă iOS 2.0+, SwiftUI — iOS 13+.

Se poate folosi Interface Builder cu SwiftUI?

Nu, Interface Builder nu este compatibil direct cu SwiftUI. SwiftUI folosește propriul sintaxă declarativă și Canvas Preview. Cu toate acestea, proiectele UIKit create prin IB pot fi integrate în SwiftUI prin UIViewRepresentable, iar vizualizările SwiftUI pot fi încorporate în UIKit prin UIHostingController. Acest lucru permite migrarea treptată de la IB la SwiftUI.

Ce sunt @IBDesignable și @IBInspectable?

@IBDesignable — o adnotare Swift care afișează un UIView personalizat direct în Interface Builder în timp real fără a rula aplicația. @IBInspectable — o adnotare pentru proprietăți care le adaugă în panoul Attributes Inspector IB. Ambele adnotări accelerează dezvoltarea componentelor UI personalizate: este suficient să modificați o proprietate în inspector — modificarea este imediat vizibilă pe plansă.

Cum funcționează Auto Layout în Interface Builder?

Auto Layout în Interface Builder stabilește constrângeri prin meniul Pin (spațieri, lățime, înălțime) și Align (centrare, baseline). Fiecare constrângere este o relație matematică între vizualizări. IB afișează erorile cu linii roșii, conflictele cu avertismente galbene. Size Classes în IB permit stabilirea unor constrângeri diferite pentru diferite dispozitive și orientări fără a scrie cod.

Cum se leagă codul de Interface Builder prin IBOutlet și IBAction?

IBOutlet — o adnotare pentru o referință la un element UI din cod (de exemplu, @IBOutlet weak var label: UILabel!). IBAction — o adnotare pentru o metodă apelată la un eveniment (de exemplu, @IBAction func buttonTapped(_ sender: UIButton)). Conexiunea se creează prin Ctrl+drag din plansa IB în fișierul controlerului. Xcode generează automat codul conexiunii la eliberarea mouse-ului.

Concluzii

  • Interface Builder — editor vizual în Xcode pentru UIKit cu istorie din 1988 (NeXTSTEP)
  • Storyboard este potrivit pentru prototipare, XIB — pentru componente reutilizabile și proiecte de producție
  • Auto Layout și Size Classes în IB permit crearea de interfețe adaptive fără cod
  • IBOutlet și IBAction leagă codul de UI prin Ctrl+drag cu generarea automată a proprietăților Swift
  • @IBDesignable și @IBInspectable accelerează dezvoltarea vizualizărilor personalizate cu previzualizare în IB
  • SwiftUI Preview înlocuiește IB în proiecte noi, dar IB rămâne standardul pentru UIKit legacy
  • Cele mai bune practici: XIB în loc de Storyboard, weak IBOutlet, identificarea constrângerilor, separarea awakeFromNib și configurare

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și