Agreed. 4-8 might even be a little generous sometimes :)

On Thu, Feb 19, 2015 at 11:16 AM, Brian Gerstle <[email protected]>
wrote:

> +1 for everything corey said
>
> On Thu, Feb 19, 2015 at 1:38 PM, Corey Floyd <[email protected]> wrote:
>
>> Adam great point above about Interface Builder - it should absolutely be
>> the first choice for building UI before anything else - Xcode 6's IB
>> autolayout support is fantastic and you can do pretty much anything that
>> doesn't involve dynamically changing a constraint at runtime. Always use
>> the highest level abstraction you can (we currently have a lot of layout
>> written in code that could/should be done in IB).
>>
>> But for anything that is better done in code, I highly recommend using
>> Masonry before the other methods.
>>
>> The entire point of Masonry's existence is that building constraints in
>> code is at best verbose (if you construct NSLayoutConstraints objects), and
>> at worst difficult to debug (if you use VFL since there is no compiler time
>> checking of your constraints).
>>
>> Even setting up 4-8 constraints is pretty unwieldy in code. I think the
>> Masonry readme does a good job of demonstrating this (
>> https://github.com/Masonry/Masonry), but a real example might be better…
>>
>> See this existing 40 lines of code from our project. Not only is it long,
>> but I think most people will need to look it over a few times to understand
>> it - I am pretty experienced with autolayout, and it took me a couple
>> minutes to get the intent (get ready to scroll):
>>
>>       NSDictionary *views = @{@"label": label, @"v1": view};
>>
>>       NSDictionary *metrics = @{
>>
>>                     @"iconHeight": @(iconHeight),
>>
>>                     @"topBarHeight": @(topBarHeight)
>>
>>        };
>>
>>
>>
>>                 [view addConstraints:[NSLayoutConstraint
>> constraintsWithVisualFormat: @"V:[v1(topBarHeight)]"
>>
>>
>>     options: 0
>>
>>
>>     metrics: metrics
>>
>>
>>       views: views]];
>>
>>
>>
>>                 [view addConstraints:[NSLayoutConstraint
>> constraintsWithVisualFormat: @"V:[label(iconHeight)]"
>>
>>
>>     options: 0
>>
>>
>>     metrics: metrics
>>
>>
>>       views: views]];
>>
>>
>>
>>                 [view addConstraints:[NSLayoutConstraint
>> constraintsWithVisualFormat: @"H:[label(iconHeight)]"
>>
>>
>>     options: 0
>>
>>
>>     metrics: metrics
>>
>>
>>       views: views]];
>>
>>
>>
>>                 [view addConstraint: [NSLayoutConstraint
>> constraintWithItem: label
>>
>>
>> attribute: NSLayoutAttributeCenterX
>>
>>
>> relatedBy: NSLayoutRelationEqual
>>
>>
>> toItem: view
>>
>>
>> attribute: NSLayoutAttributeCenterX
>>
>>
>> multiplier: 1
>>
>>
>> constant: 0]];
>>
>>
>>
>>                 [view addConstraint: [NSLayoutConstraint
>> constraintWithItem: label
>>
>>
>> attribute: NSLayoutAttributeCenterY
>>
>>
>> relatedBy: NSLayoutRelationEqual
>>
>>
>> toItem: view
>>
>>
>> attribute: NSLayoutAttributeCenterY
>>
>>
>> multiplier: 1
>>
>>
>> constant: 0]];
>>
>>
>> -----
>>
>> Compare that to the code below:
>>
>>                 [view mas_makeConstraints:^(MASConstraintMaker *make) {
>>
>>                     make.height.equalTo(@(topBarHeight));
>>
>>                     make.center.equalTo(label);
>>
>>                 }];
>>
>>                 [label mas_makeConstraints:^(MASConstraintMaker *make) {
>>
>>                     make.height.equalTo(@(iconHeight));
>>
>>                     make.width.equalTo(@(iconHeight));
>>
>>
>>                 }];
>>
>> It took me longer to grok the old code than it did for me to write the 10
>> lines to replace it. Not to mention, the intent of the Masonry code reads
>> very well (no keys to assign to my views, no dictionaries to hold values).
>> And the best part is that the compiler would instantly tell me if I had
>> written an invalid constraint, unlike the old code where it would have been
>> very easy for someone to forget to type a "(" or a ":"
>>
>> (note: conflicting/ambiguous constraints are different concern that
>> really only IB can handle which is a good reason why you should always try
>> to use that first)
>>
>>
>> On Thu, Feb 19, 2015 at 12:34 PM, Adam Baso <[email protected]> wrote:
>>
>>> Here's my take on this is:
>>>
>>> |_ Establish layout related stuff in XIBs via Interface Builder when
>>> possible.
>>> |__ If the XIB approach is inadequate, use VFL where it's easy and clear
>>> and achieves the desired result.
>>> |___ If VFL is insufficient, try the more verbose builtin methods if
>>> they don't make it too hard (e.g., 4-8 manual constraints isn't that bad,
>>> but when it starts to go over that, things are probably getting messier
>>> than needed).
>>> |____ When XIBs, VFL, and verbose methods are too cumbersome, use
>>> Masonry if it helps achieve the task with greater clarity, easy, and
>>> correctness.
>>>
>>> I trust we'll all be able to make reasonable case-by-case judgments
>>> about when to fall back from XIB+VFL+builtins to Masonry.
>>>
>>> -Adam
>>>
>>>
>>>
>>>
>>> On Wed, Feb 18, 2015 at 10:07 PM, Corey Floyd <[email protected]>
>>> wrote:
>>>
>>>> Yeah we could swap them out when we need to pretty easily
>>>>
>>>> On Wed, Feb 18, 2015 at 6:48 PM, Monte Hurd <[email protected]>
>>>> wrote:
>>>>
>>>>> Oooh interesting! I hadn't considered calling back to the Obj-C
>>>>> version from Swift land...
>>>>>
>>>>> On Wed, Feb 18, 2015 at 3:13 PM, Brion Vibber <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> It looks like it is possible to use the Obj-C version from Swift:
>>>>>>
>>>>>> https://github.com/Masonry/Masonry/issues/75#issuecomment-55230720
>>>>>>
>>>>>> so one could probably migrate UI classes using it bit by bit.
>>>>>>
>>>>>> But the new all-Swift version in Snap apparently has a cleaner syntax
>>>>>> that fits with Swift better...
>>>>>>
>>>>>> Actually, do they conflict? Could we start with one in Obj-C and
>>>>>> transition to the Swift one in Swift classes, while both sit in place? In
>>>>>> theory they're creating regular layout constraints so it's just the setup
>>>>>> calls that are different...
>>>>>>
>>>>>> -- brion
>>>>>>
>>>>>> On Wed, Feb 18, 2015 at 2:59 PM, Monte Hurd <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> I found this Swift version of Masonry:
>>>>>>> https://github.com/Masonry/Snap
>>>>>>>
>>>>>>> Are we confident in it, or does anyone know if the original Masonry
>>>>>>> repo maintainers have Swift plans?
>>>>>>>
>>>>>>> If not, assuming one of our long-term goals is to eventually convert
>>>>>>> as much of the codebase to Swift as is practical, wouldn't adopting 
>>>>>>> Masonry
>>>>>>> further entrench Obj-C implementations?
>>>>>>>
>>>>>>> i.e. to "Swift-ify" Masonry'ed code we'd have to decompose Masonry
>>>>>>> syntax back to VFL strings and/or NSLayoutConstraints.
>>>>>>>
>>>>>>> If there's not a solid Swift implementation, I'd be unsure if
>>>>>>> Masonry use is wise strategically. Thoughts?
>>>>>>>
>>>>>>> Any concern that Masonry's syntax, while concise/elegant, raises the
>>>>>>> bar for outside contributions in that it deviates from the "standard"
>>>>>>> approach at all?
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Feb 18, 2015 at 10:09 AM, Brian Gerstle <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> +1
>>>>>>>>
>>>>>>>> On Wed, Feb 18, 2015 at 12:32 PM, Corey Floyd <[email protected]
>>>>>>>> > wrote:
>>>>>>>>
>>>>>>>>> We were evaluating Masonry prior to our new 3rd party lib vetting
>>>>>>>>> process (See here for more info:
>>>>>>>>> https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/Third_Party_Libraries),
>>>>>>>>> but still wanted to do a write up for everyone.
>>>>>>>>>
>>>>>>>>> Masonry is a library that allows developers to write autolayout
>>>>>>>>> code similar to the Visual Format Language, but instead of error prone
>>>>>>>>> strings to describe relationships, it provides a compact compiler 
>>>>>>>>> checked
>>>>>>>>> syntax. You can read more here:
>>>>>>>>> https://github.com/Masonry/Masonry
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Below are answers to our standard questions:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>    - Is the license permissive?
>>>>>>>>>
>>>>>>>>> Yes - MIT
>>>>>>>>>
>>>>>>>>>    - Is the library ubiquitous?
>>>>>>>>>
>>>>>>>>> Yes 4,362+ stars and 475 forks on Github.
>>>>>>>>>
>>>>>>>>>    -  Is it installable via CocoaPods?
>>>>>>>>>
>>>>>>>>> Yes
>>>>>>>>>
>>>>>>>>>    - What is the impact on binary size?
>>>>>>>>>
>>>>>>>>> Negligible - no included assets
>>>>>>>>>
>>>>>>>>>    - How severe, if at all, are inbuilt subdependencies?
>>>>>>>>>
>>>>>>>>> No 3rd party dependencies
>>>>>>>>>
>>>>>>>>>    - Will this make the code more, or less, understandable for
>>>>>>>>>    volunteers?
>>>>>>>>>
>>>>>>>>> More understandable - it provides an expressive "english" syntax
>>>>>>>>> for creating autolayout constraints. It introduces no new concepts, 
>>>>>>>>> just
>>>>>>>>> type checking and syntax.
>>>>>>>>>
>>>>>>>>>    - What are the performance ramifications of using this
>>>>>>>>>    library?
>>>>>>>>>
>>>>>>>>> None, it uses cocoa autolayout under the covers.
>>>>>>>>>
>>>>>>>>>    - What are the complexity ramifications of using this library?
>>>>>>>>>
>>>>>>>>> Masonry allows developers to write layout code in a much more
>>>>>>>>> concise and expressive way - this should reduce number of lines while
>>>>>>>>> increasing expressiveness.
>>>>>>>>>
>>>>>>>>>    - Is it actively maintained?
>>>>>>>>>
>>>>>>>>> Yes and receives frequent pull requests.
>>>>>>>>>
>>>>>>>>>    - Is it compatible with current deployment targets?
>>>>>>>>>
>>>>>>>>> Yep
>>>>>>>>>
>>>>>>>>>    - Does it hinder interop (e.g., with Swift)?
>>>>>>>>>
>>>>>>>>> Nope
>>>>>>>>>
>>>>>>>>>    - What is the exit plan if the library becomes unmaintained?
>>>>>>>>>
>>>>>>>>> Since Masonry is basically just a syntax veneer of autolayout - it
>>>>>>>>> should be possible for us to maintain if needed. There aren't any 
>>>>>>>>> foreign
>>>>>>>>> concepts to understand. If we choose not to maintain - the 
>>>>>>>>> constraints can
>>>>>>>>> be translated to the VFL language (or Interface Builder) easily.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> If anyone has questions / comments - please reply here.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Mobile-l mailing list
>>>>>>>>> [email protected]
>>>>>>>>> https://lists.wikimedia.org/mailman/listinfo/mobile-l
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> EN Wikipedia user page:
>>>>>>>> https://en.wikipedia.org/wiki/User:Brian.gerstle
>>>>>>>> IRC: bgerstle
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Mobile-l mailing list
>>>>>>>> [email protected]
>>>>>>>> https://lists.wikimedia.org/mailman/listinfo/mobile-l
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Mobile-l mailing list
>>>>>>> [email protected]
>>>>>>> https://lists.wikimedia.org/mailman/listinfo/mobile-l
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Mobile-l mailing list
>>>>> [email protected]
>>>>> https://lists.wikimedia.org/mailman/listinfo/mobile-l
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Corey Floyd
>>>> Software Engineer
>>>> Mobile Apps / iOS
>>>> Wikimedia Foundation
>>>>
>>>> _______________________________________________
>>>> Mobile-l mailing list
>>>> [email protected]
>>>> https://lists.wikimedia.org/mailman/listinfo/mobile-l
>>>>
>>>>
>>>
>>
>>
>> --
>> Corey Floyd
>> Software Engineer
>> Mobile Apps / iOS
>> Wikimedia Foundation
>>
>> _______________________________________________
>> Mobile-l mailing list
>> [email protected]
>> https://lists.wikimedia.org/mailman/listinfo/mobile-l
>>
>>
>
>
> --
> EN Wikipedia user page: https://en.wikipedia.org/wiki/User:Brian.gerstle
> IRC: bgerstle
>
_______________________________________________
Mobile-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mobile-l

Reply via email to