{"id":37473,"date":"2016-07-10T13:01:35","date_gmt":"2016-07-10T07:31:35","guid":{"rendered":"http:\/\/www.tothenew.com\/blog\/?p=37473"},"modified":"2016-07-10T13:01:35","modified_gmt":"2016-07-10T07:31:35","slug":"nsgridview-a-new-layout-container-for-macos","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/nsgridview-a-new-layout-container-for-macos\/","title":{"rendered":"NSGridView : A new layout container for macOS"},"content":{"rendered":"<p><strong>What\u2019s the need of NSGridView : <\/strong><br \/>\nSuppose you want to create a view which should look like this and to create it we have following available options:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"\/blog\/wp-ttn-blog\/uploads\/2016\/07\/5.png\" alt=\"5\" width=\"300\" height=\"177\" class=\"alignnone size-medium wp-image-37479\" \/><\/p>\n<p>1. <strong>Autolayout<\/strong> : <\/p>\n<li>\n<ul>Maintanence on constraints is complicated<\/ul>\n<\/li>\n<p>2. <strong>NS\/UIStackView<\/strong> :<\/p>\n<ul>\n<li>Arranging a sequence of items<\/li>\n<li>Fine control over content size and spacing<\/li>\n<\/ul>\n<p>To make the above design less complicated and easily designable Apple has introduced a 3rd option.<\/p>\n<p>3. <strong>NSGridView<\/strong> :<\/p>\n<ul>\n<li>Places views in an explicitly defined grid<\/li>\n<li>Content aligned across rows and columns<\/li>\n<li>Great for arranging static grid-like UI<\/li>\n<\/ul>\n<p><strong>Overview:<\/strong><br \/>\nNSGridView consists of<\/p>\n<p>1. <strong>NSGridRow and NSGridColumn<\/strong> : It has following attributes<\/p>\n<ul>\n<li>Automatic or explicit sizing<\/li>\n<li>Optional padding and spacing<\/li>\n<li>Hidden rows and columns<\/li>\n<\/ul>\n<p>2. <strong>NSGridCell<\/strong> : It has following attributes<\/p>\n<ul>\n<li>Each cell manages a content view<\/li>\n<li>Adjustable placement<\/li>\n<\/ul>\n<p><strong>Start Designing with NSGridView<\/strong> :<br \/>\nFor now this view is not available in Interface Builder you have to create it via programming only.<\/p>\n<p>[code language=&#8221;objc&#8221;]<br \/>\nlet empty = NSGridCell.emptyContentView<br \/>\nlet gridView = NSGridView(views: [<br \/>\n[brailleTranslationLabel, brailleTranslationPopup],<br \/>\n[empty, showContractedCheckbox],<br \/>\n[empty, showEightDotCheckbox],<br \/>\n[statusCellsLabel, showGeneralDisplayCB],<br \/>\n[empty, textStyleCB],<br \/>\n[showAlertCB]<br \/>\n])<br \/>\n[\/code] <\/p>\n<p>This code has only added subview to NSGridView but alignment (spacing and padding) is not proper.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"\/blog\/wp-ttn-blog\/uploads\/2016\/07\/1.png\" alt=\"1\" width=\"391\" height=\"194\" class=\"alignnone size-full wp-image-37475\" \/><\/p>\n<p>Now set the hugging priority and remove spaces between rows and columns.<\/p>\n<p>[code language=&#8221;objc&#8221;]<br \/>\ngridView.setContentHuggingPriority(600, for: .horizontal)<br \/>\ngridView.setContentHuggingPriority(600, for: .vertical)<br \/>\n[\/code]<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"\/blog\/wp-ttn-blog\/uploads\/2016\/07\/2.png\" alt=\"2\" width=\"300\" height=\"120\" class=\"alignnone size-medium wp-image-37476\" \/><\/p>\n<p>Now set the placement of first colmn.<\/p>\n<p>[code language=&#8221;objc&#8221;]<br \/>\n\/\/ the first column needs to be right-justified:<br \/>\ngridView.column(at: 0).xPlacement = .trailing<br \/>\n\/\/ all cells use firstBaseline alignment<br \/>\ngridView.rowAlignment = .firstBaseline<br \/>\n[\/code]<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"\/blog\/wp-ttn-blog\/uploads\/2016\/07\/3.png\" alt=\"3\" width=\"300\" height=\"119\" class=\"alignnone size-medium wp-image-37477\" \/><\/p>\n<p>Now set the verticle padding as per design. <\/p>\n<p>[code language=&#8221;objc&#8221;]<br \/>\n\/\/ We need a little extra vertical space around the popup:<br \/>\nlet row = gridView.cell(for: brailleTranslationPopup)!.row!<br \/>\nrow.topPadding = 5<br \/>\nrow.bottomPadding = 5<br \/>\ngridView.cell(for:statusCellsLabel)!.row!.topPadding = 6<br \/>\n[\/code]<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"\/blog\/wp-ttn-blog\/uploads\/2016\/07\/4.png\" alt=\"4\" width=\"300\" height=\"130\" class=\"alignnone size-medium wp-image-37478\" \/><\/p>\n<p>Now we need alert message checkbox to be centered.<\/p>\n<p>[code language=&#8221;objc&#8221;]<br \/>\n\/\/ Special treatment for centered checkbox:<br \/>\nlet cell = gridView.cell(for: showAlertCB)!<br \/>\ncell.row!.topPadding = 4<br \/>\ncell.row!.mergeCells(in: NSMakeRange(0, 2))<br \/>\ncell.xPlacement = .none<br \/>\nlet centering = showAlertCB.centerXAnchor.constraint(equalTo: textStyleCB.leadingAnchor)<br \/>\ncell.customPlacementConstraints = [centering]<br \/>\n[\/code]<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"\/blog\/wp-ttn-blog\/uploads\/2016\/07\/5.png\" alt=\"5\" width=\"300\" height=\"177\" class=\"alignnone size-medium wp-image-37479\" \/><\/p>\n<p>Congratulations! You are done with NSGridView.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What\u2019s the need of NSGridView : Suppose you want to create a view which should look like this and to create it we have following available options: 1. Autolayout : Maintanence on constraints is complicated 2. NS\/UIStackView : Arranging a sequence of items Fine control over content size and spacing To make the above design [&hellip;]<\/p>\n","protected":false},"author":172,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":170},"categories":[1400,1772,1994,1],"tags":[3106,3717,3714,3715,3719,3720,3716,3718],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/37473"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/172"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=37473"}],"version-history":[{"count":0,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/37473\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=37473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=37473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=37473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}