Skip to content

Instantly share code, notes, and snippets.

@krzysztofzablocki
Created August 4, 2015 11:27
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krzysztofzablocki/ccca13edd4fe5d85a75d to your computer and use it in GitHub Desktop.
Save krzysztofzablocki/ccca13edd4fe5d85a75d to your computer and use it in GitHub Desktop.
@import UIKit;
@interface UINavigationItem (KZAdditions)
@property (nonatomic, copy) NSDictionary *kz_titleTextAttributes;
@end
#import "UINavigationItem+KZAdditions.h"
#import "Aspects.h"
@import ObjectiveC.runtime;
static void const *TitleTextAttributesKey = &TitleTextAttributesKey;
@implementation UINavigationItem (UGCAdditions)
- (NSDictionary *)kz_titleTextAttributes;
{
return objc_getAssociatedObject(self, TitleTextAttributesKey);
}
- (void)setKz_titleTextAttributes:(NSDictionary *)titleTextAttributes;
{
objc_setAssociatedObject(self, TitleTextAttributesKey, titleTextAttributes, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
__attribute__((constructor)) static void __load()
{
void (^setAttributes)(id, UIViewController *) = ^(id target, UIViewController *vc) {
NSCParameterAssert([target isKindOfClass:UINavigationController.class]);
UINavigationController *navigationController = target;
navigationController.navigationBar.titleTextAttributes = vc.navigationItem.kz_titleTextAttributes;
};
[UINavigationController aspect_hookSelector:@selector(pushViewController:animated:) withOptions:AspectPositionBefore usingBlock:^(id <AspectInfo> info, UIViewController *vc, BOOL _) {
setAttributes(info.instance, vc);
} error:nil];
[UINavigationController aspect_hookSelector:@selector(popViewControllerAnimated:) withOptions:AspectPositionBefore usingBlock:^(id <AspectInfo> info, BOOL _) {
UINavigationController *navigationController = (UINavigationController *)info.instance;
int index = (int)(navigationController.viewControllers.count - 2);
if (index >= 0) {
UIViewController *vc = navigationController.viewControllers[index];
setAttributes(navigationController, vc);
}
} error:nil];
[UINavigationController aspect_hookSelector:@selector(popToRootViewControllerAnimated:) withOptions:AspectPositionBefore usingBlock:^(id <AspectInfo> info, BOOL _) {
UINavigationController *navigationController = (UINavigationController *)info.instance;
setAttributes(navigationController, navigationController.viewControllers.firstObject);
} error:nil];
[UINavigationController aspect_hookSelector:@selector(popToViewController:animated:) withOptions:AspectPositionBefore usingBlock:^(id <AspectInfo> info, UIViewController *vc, BOOL _) {
setAttributes(info.instance, vc);
} error:nil];
[UINavigationController aspect_hookSelector:@selector(setViewControllers:animated:) withOptions:AspectPositionBefore usingBlock:^(id <AspectInfo> info, NSArray *viewControllers, BOOL _) {
int index = (int)(viewControllers.count - 1);
if (index >= 0) {
setAttributes(info.instance, viewControllers[index]);
}
} error:nil];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment