tolo / InterfaCSS

The CSS-inspired styling and layout framework for iOS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TabBarItem in XML

tbrannam opened this issue · comments

Attempting to create a styled tabBarItem in xml, results in UIView being allocated and assigned to filesowner.tabBarItem - I suspect a similar situation might occur for navigationItem

<?xml version="1.0" encoding="UTF-8"?>
<view class="root">
    <tabbaritem property="tabBarItem" class="foo" add="NO"/>
</view>

I noticed that UITabBarItem was declared style-able in the stylesheet wiki. I added a Naive implementation in the parser:didStartElement:

else if ( [viewClass isSubclassOfClass:UITabBarItem.class] ) {
    viewBuilderBlock = ^UIView* (UIView* superview) {
        UITabBarItem *tabBarItem = nil;
        if ([self.fileOwner respondsToSelector:@selector(tabBarItem)]){
            tabBarItem = [self.fileOwner tabBarItem];
            tabBarItem.styleClassISS = styleClass;
        }
        return (UIView *)tabBarItem;
    };
    addSubview = NO;
}

but I observe that UITabBarItem is not a UIView, so all the UIView(InterfaCSS) category methods do not apply -- changing that category to NSObject(InterfaCSS) seems possible, but that seems like a very big change.

I'll note also that placing the tabbaritem in the xml also creates a condition that requires that the view must be loaded in order for the tabbaritem to be registered. This is different than what happens with regular nib. The UITabBarItem from a nib is loaded before loadView is loaded.

Did you have thoughts about how UITabBarItem and UINavigationItem would be declared and styled through markup?

If I load the CSS before loadView I can accomplish styling of the tabbar item by overriding

- (UITabBarItem *)tabBarItem
{
   [self loadStyles];
   UITabBarItem *tabBarItem = [super tabBarItem];
   tabBarItem.styleClassISS = @"foo";
   [[InterfaCSS interfaCSS] applyStyling:tabBarItem includeSubViews:NO force:YES];
   return tabBarItem;
}

You can actually accomplish this by adding [[InterfaCSS sharedInstance] addStyleClass:@"foo" forUIElement:self.tabBarItem]; to loadView of the view controller. Updated the sample code to illustrate this.

Tab bar items and navigation items (when used with UITabBarController/UINavigationController) are not something I've planned to add support for in the view definition file, since those require a bit of special handling. I may possibly add support for standalone toolbars and tab bars though.

The UIView(InterfaCSS) category is actually only a convenience wrapper for the corresponding methods in class InterfaCSS (that accepts objects of any class), and it exists because almost all styling of an application will be done on a UIView subclass (and it also felt odd to "pollute" every single class in the platform with styling methods).

Awesome - thanks.