Skip to content

renetik/renetik-ios-layout

Repository files navigation

Xcode - Build Analyze

Renetik iOS - Layout

Framework to enjoy, improve and speed up your application development while writing readable code. Used as library in many projects and improving it while developing new projects. I am open to Hire or investment in my mobile app music production & perfromance project Renetik Instruments www.renetik.com.

About

Write complex reliable layouts easy, by using declarative readable syntax and pure code approach. This way you never has to rewrite your layout again using other whatever way to do it. Its always compatible because it is based on basic UIKit underlying technology. You don't need to learn new artificial paradigms to solve the same puzzle by different methods all over again, just get better in real programming and focus on your task, not new ways of doing things that distract you from making great products.

Tested on iOS, MacOS Catalyst

Basic idea

Is to have functions onCreate and onLayout in parent class as well as in layout code structure so it is well structired and visualy resembles structure of actual layout. Other is to use fuctions like from(top:.. matchParentWidth(padding:..) flex(right:.. heightToFit() and others that gives you tools to create any layout you imgine easily. This all is just basic UIKit staf. Then there is updateLayout(forced:Bool that do update of layout or also all parent views, its also important yo use CSSceneDelgate as it calls updateLayout for some views on orientation change what is necessary in some cases.. Otherwise I believe performance wise this library is best you can get, but stil can be improved potentialy but I didnt focused on that much yet.

Example

Readability and simplicity of approach are the solutions for maintainable code base. Using SwiftUI preview opened new previously unimaginable possibilities, where even advanced editor of Android Studio strugles. Write beatiful code while be in control of what is really happening with full access to make any fix necessary easily.

import RenetikLayout

class HeaderSectionView: CSView {
    override class func construct() -> Self {
        super.construct().background(color: .demo_control)
    }
    let header = wrap(UILabel.construct("App")).styleHeader()
    let buttons = ButtonsView.construct()

    override func onCreate() {
        super.onCreate()
        add(view: header).matchParentWidth().from(top: 0)
        add(view: HorizontalLineStrong.constructMedium())
            .fromPrevious(top: 0).matchParentWidth()
        add(view: buttons).fromPrevious(top: 0).matchParentWidth()
        heightByLastSubview()
    }
}
#if DEBUG
    import SwiftUI
    class AppPreview: PreviewProvider, CSPreviewProvider {
        class func preview(in window: UIView) {
            window.add(view: HeaderSectionView.construct())
                .matchParentWidth().heightToFit()
        }
    }
#endif

Create fully dynamic layouts with simple practices based on fundamental patterns and modern readable clean syntax.

Undelying codebase is easy to read and understand so you dont get lost and can focuse on how layout actually work instead of how library works.

class ButtonsView: CSView {
    override class func construct() -> Self {
        super.construct().background(color: .demo_control)
    }
    let moveButton = IconTextButton.construct(icon: .open_with, title: "Move")
    let resizeButton = IconTextButton.construct(icon: .fit_screen, title: "Resize")
    let scalesButton = IconTextButton.construct(icon: .aspect_ratio, title: "Scales")
    let typeButton = IconTextButton.construct(icon: .dashboard, title: "Type")

    override func onCreate() {
        super.onCreate()
        add(view: CSView.construct(),
            onCreate: { [unowned self] in
                $0.fromPrevious(top: 0).matchParentWidth().height(60)
                $0.add(view: moveButton,
                    onCreate: { $0.from(left: 0).matchParentHeight() },
                    onLayout: { $0.width($0.superview!.width / 2) })
                $0.add(view: VerticalLine.constructMedium(),
                    onCreate: { $0.matchParentHeight() },
                    onLayout: { $0.fromPrevious(left: 0) })
                $0.add(view: resizeButton,
                    onCreate: { $0.matchParentHeight() },
                    onLayout: { $0.fromPrevious(left: 0).width($0.superview!.width / 2) })
            })
        add(view: HorizontalLineStrong.constructMedium())
            .fromPrevious(top: 0).matchParentWidth()
        add(view: CSView.construct(),
            onCreate: { [unowned self] in
                $0.fromPrevious(top: 0).matchParentWidth().height(60)
                $0.add(view: scalesButton,
                    onCreate: { $0.from(left: 0).matchParentHeight() },
                    onLayout: { $0.width($0.superview!.width / 2) })
                $0.add(view: VerticalLine.constructMedium(),
                    onCreate: { $0.matchParentHeight() },
                    onLayout: { $0.fromPrevious(left: 0) })
                $0.add(view: typeButton,
                    onCreate: { $0.matchParentHeight() },
                    onLayout: { $0.fromPrevious(left: 0).fill(right: 0) })
            })
        heightByLastSubview()
    }
}

Demo

To run the example project, clone the repo and open Demo project. It is demonstration of some of best approaches I use in iOS development, but more will come in other libraries.

Requirements

Open and clear mind.

Installation

You can install using swift package manager for now using latest released version or master.

Usage

Look at usage in demo application or Documentation that will be hopefully documented better soon, but don't hesitate to look at actual implementation, because it's always as simple as possible, names are always descriptive, and syntax is always readable, because I do just that, I remeber a little and have to understand it quickly from codebase again.

Author

Renetik, Website

Hire me ! or check out Renetik Instruments

License

Renetik Layout is available under the MIT license. See the LICENSE file for more info.