2017-10-26 10:06:34 SMoothiemiss 阅读数 3499

iOS 11 自定义UINavigationBar适配问题,导航条向上偏移20点问题

UINavigationBar结构改变了,需要将barcontentview frame调整一下

这里写图片描述

解决方案 自己写一个类 继承UINavigationBar 重写layoutSubviews方法改变frame即可。

- (void)layoutSubviews {
    [super layoutSubviews];
#ifdef __IPHONE_11_0
    if (@available(iOS 11.0, *)) {
        self.hx_h = kNavigationBarHeight;
        for (UIView *view in self.subviews) {
            if([NSStringFromClass([view class]) containsString:@"Background"]) {
                view.frame = self.bounds;
            }
            else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
                CGRect frame = view.frame;
                frame.origin.y = kNavigationBarHeight - 44;
                frame.size.height = self.bounds.size.height - frame.origin.y;
                view.frame = frame;
            }
        }
    }
#endif
}

2017-09-26 13:27:47 PianZhideNanRen 阅读数 1398

相信这段时间大家都在适配iOS11,我下面就是记录一下我适配的两个问题;

关于iOS11新出的安全区域、navigation的层级改变等都不在赘述,网上一大堆,下面就看问题;

1.我的项目首页是一个全屏的collectionView,导航条是自定义view(大家懂得),滑动的时候导航条透明度改变。在iOS11上出现collectionView下移了20,把刷新控件漏出来了;这个是因为iOS11新加的安全区域特性造成的。

解决:

//  偏移20/64适配

    if (@available(iOS 11.0, *)) {

        self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

    }


2.导航条返回按钮下移20,这是因为iOS11导航条层级改变(导航条容易改变复杂)。我用的是系统导航按钮(可以保留系统返回动画)

原来的做法和大家一样

//隐藏返回按钮的文字

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

但是iOS11失效了


我看网上大家很多都使用的分类添加自定义按钮,但是这样不仅要修改大量代码,而且没有了系统返回动画和侧滑返回,这不是我想要的

其实修改系统的更简单了,这个是临时方案,相信以后会出现更好的,感觉返回图片是白色的时候有点糊

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];   //设置返回按钮的颜色


    if (@available(iOS 11.0, *)) {

        [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];//将title 文字的颜色改为透明

    }else {

        //隐藏返回按钮的文字

        [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

    }


2016-07-09 10:05:25 sooner78 阅读数 297

在ios开发中,导航栏一般是必不可少的。比如:UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:YYViewController];

但是如果 向控制器 添加一些小的控件,可能会被导航栏遮盖,这个时候我们可以将一下代码,放到 YYViewController 控制器中。

// 禁用自动偏移
self.modalPresentationCapturesStatusBarAppearance = NO;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;

这样 YYViewController 会以导航栏左下角为 起点。
效果对比

tips: 这段代码很简单,记住更好。记不住,知道这个方法,每次粘贴就行。

2016-03-09 22:14:33 MinggeQingchun 阅读数 1094

使用导航Push进来以TableView为主的视图(继承于scroll,包括Scroll),原本我们想隐藏了导航栏将这个scroll放在坐标为(0,0)的位置,但是发现效果如下:

1、没有隐藏导航栏

     从iOS7开始,导航条和状态栏合为一体,且成为半透明状,viewController.view的坐标(0,0)点在屏幕左上方,如果子视图位置在view的顶部,就会被导航条遮盖,所以viewController仅仅会对自身的第一个子视图(scrollView)顶部添加64个像素的contentInset边距,避免scrollView内容遮盖,默认YES。我们的scroll、table会自动向下偏离Top64px(下方位置如果是tabbar向上偏离Bottom49px,toolbar是44)

 

   

self.automaticallyAdjustsScrollViewInsets = YES;

    //或者设置NO手动添加 UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)

    //table.contentInset = UIEdgeInsetsMake(64,0,0,0);

 

 

 

 

 

2、隐藏了导航栏

     但这个scroll的轮播图却依然在状态栏以下,并没有将状态栏覆盖。因为状态栏存在,即使隐藏了导航栏,scroll依然会给我们预留部分空白,所有内容向下偏移20px像素位置,当你滑动scroll时,又会将状态栏覆盖掉。此时我们需要设置:

    

self.automaticallyAdjustsScrollViewInsets = NO;

 

 

 

 

 

再运行那么scroll或者table就会紧贴着状态栏顶部,覆盖掉状态栏了。

2018-07-17 18:06:59 die_word 阅读数 875

导航控制器是我们常用的控制器,在iOS10之前我们自定义的导航按钮在添加时会有为20个像素的间隙问题,通常的解决方式是创建一个类型为fixed..Space的item加入导航按钮组去解决间隙过大问题,但是但是在iOS10之后此方法就不在实用了!

如图:

之前的解决方式如下

lazy var leftButton:UIButton = {
        let button:UIButton = UIButton.init(frame: CGRect(x: 0, y: 0, width: 45, height: 45))
        button.setImage(UIImage(named: "left"), for: .normal)
//        /*向左进行偏移*/
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 0)
        button.addTarget(self, action: #selector(actionLeft), for: .touchUpInside)
        return button
    }()

override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white

        let leftItem:UIBarButtonItem = UIBarButtonItem.init(customView: self.leftButton)
        let spaceItem:UIBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        spaceItem.width = -20
        self.navigationItem.leftBarButtonItems = [spaceItem,leftItem]
}

此方法在iOS10之后是无法使用的,为此解决的方法是为button设置一下内容偏移

lazy var leftButton:UIButton = {
        let button:UIButton = UIButton.init(frame: CGRect(x: 0, y: 0, width: 45, height: 45))
        button.setImage(UIImage(named: "left"), for: .normal)
//        /*向左进行偏移*/
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 0)
        button.addTarget(self, action: #selector(actionLeft), for: .touchUpInside)
        return button
    }()

此方法会造成响应区域问题。可以通过为button类添加分类

#import <UIKit/UIKit.h>

@interface UIButton (EnlargeTouchArea)
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;
- (void)setEnlargeEdge:(CGFloat) size;
@end
#import "UIButton+EnlargeTouchArea.h"
#import <objc/runtime.h>
static char topNameKey;
static char rightNameKey;
static char bottomNameKey;
static char leftNameKey;
@implementation UIButton (EnlargeTouchArea)
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left {
    objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (void)setEnlargeEdge:(CGFloat) size {
    objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);

}
- (CGRect) enlargedRect
{
    NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
    NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
    NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
    NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
    if (topEdge && rightEdge && bottomEdge && leftEdge)
    {
        return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
                          self.bounds.origin.y - topEdge.floatValue,
                          self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
                          self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
    }
    else
    {
        return self.bounds;
    }
}

- (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event
{
    CGRect rect = [self enlargedRect];
    if (CGRectEqualToRect(rect, self.bounds))
    {
        return [super hitTest:point withEvent:event];
    }
    return CGRectContainsPoint(rect, point) ? self : nil;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect bounds =CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    //宽高希望扩展的范围
    CGFloat widthDelta =self.bounds.size.width;
    CGFloat heightDelta =20;
    bounds =CGRectInset(bounds, -0.5*widthDelta, -0.5* heightDelta);//注意这里是负数,扩大了之前的bounds的范围
    return CGRectContainsPoint(bounds, point);
}

使用代码如下

/*根据方向进行扩展*/
self.leftButton.setEnlargeEdgeWithTop(20, right: 20, bottom: 20, left: 20)
// 全部扩展20个像素
self.leftButton.setEnlargeEdge(20)

结果图如下

 

没有更多推荐了,返回首页