导航栏,是个很难相处的东西。这次,iOS11继续改动了导航栏按钮的一些图层。。可以打开Xcode图层看看,这里先直接上代码了,以后再研究研究。
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, BarButtonViewPosition) {
BarButtonViewPositionLeft,
BarButtonViewPositionRight
};
@interface BarButtonView : UIView
@property (nonatomic,assign) BarButtonViewPosition position;
@end
#import "BarButtonView.h"
@interface BarButtonView ()
{
BOOL applied;
}
@end
@implementation BarButtonView
- (void)layoutSubviews
{
[superlayoutSubviews];
if (applied || [[[UIDevicecurrentDevice] systemVersion]doubleValue] < 11)
{
return;
}
// Find the _UIButtonBarStackView containing this view, which is a UIStackView, up to the UINavigationBar
UIView *view = self;
while (![view isKindOfClass:[UINavigationBar class]] && [view superview] != nil)
{
view = [view superview];
if ([view isKindOfClass:[UIStackView class]] && [view superview] != nil)
{
if (self.position == BarButtonViewPositionLeft)
{
[view.superviewaddConstraint:[NSLayoutConstraintconstraintWithItem:view attribute:NSLayoutAttributeLeadingrelatedBy:NSLayoutRelationEqualtoItem:view.superviewattribute:NSLayoutAttributeLeadingmultiplier:1.0constant:8.0]];
applied = YES;
}
elseif (self.position ==BarButtonViewPositionRight)
{
[view.superviewaddConstraint:[NSLayoutConstraintconstraintWithItem:view attribute:NSLayoutAttributeTrailingrelatedBy:NSLayoutRelationEqualtoItem:view.superviewattribute:NSLayoutAttributeTrailingmultiplier:1.0constant:-8.0]];
applied = YES;
}
break;
}
}
}
@end
引用:
- (void)setLeftBarButtonView:(UIView *)view
{
if ([[[UIDevicecurrentDevice] systemVersion]doubleValue] >= 11)
{
BarButtonView *barBtnView = [[BarButtonViewalloc] initWithFrame:view.frame];
[barBtnView setPosition:BarButtonViewPositionLeft];
[barBtnView addSubview:view];
[self.navigationItemsetLeftBarButtonItem:[[UIBarButtonItemalloc] initWithCustomView:barBtnView]];
}
else
{
UIBarButtonItem *space = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:NULL];
[space setWidth:-8];
[self.navigationItemsetLeftBarButtonItems:@[space,[[UIBarButtonItemalloc] initWithCustomView:view]]];
}
}
- (void)setRightBarButtonView:(UIView *)view
{
if ([[[UIDevicecurrentDevice] systemVersion]doubleValue] >= 11)
{
BarButtonView *barBtnView = [[BarButtonViewalloc] initWithFrame:view.frame];
[barBtnView setPosition:BarButtonViewPositionRight];
[barBtnView addSubview:view];
[self.navigationItemsetRightBarButtonItem:[[UIBarButtonItemalloc] initWithCustomView:barBtnView]];
}
else
{
UIBarButtonItem *space = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:NULL];
[space setWidth:-8];
[self.navigationItemsetRightBarButtonItems:@[space,[[UIBarButtonItemalloc] initWithCustomView:view]]];
}
}
这里的View就是传给navigationItem的CustomView
点击打开链接