11适配 ios swift_swift tableview适配ios11 - CSDN
  • swift-iOS11适配源码

    2020-06-18 23:30:08
    iOS 11适配源码
  • 导航栏+状态高度为 88,其余为64官方适配标准如下图:2. UITableview 顶部出现留白解决方法: 添加以下代码[objc] view plain copyfunc tableView(_ tableView: UITableView, viewForFooterInSection ...

    1. iPhone X tabbar 高度为 83 ,其余机型为49;  导航栏+状态高度为 88,其余为64

    官方适配标准如下图:


    2. UITableview 顶部出现留白

    解决方法: 添加以下代码

    [objc] view plain copy
    1. func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {  
    2.     return nil  
    3. }  
    4. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {  
    5.     return nil  
    6. }  

    3. iOS 11 弃用 automaticAdjustsScrollViewInsets 新增 contentInsetAdjustmentBehavior

    [objc] view plain copy
    1. if #available(iOS 11.0, *) {  
    2.     tableView.contentInsetAdjustmentBehavior = .never  
    3. else {  
    4.     self.automaticallyAdjustsScrollViewInsets = false  
    5. }  


    4. Xcode9向UIapplication 报告主线程调用 :[UIApplication statusBarOrientation]

    [objc] view plain copy
    1. Main Thread Checker: UI API called on a background thread: -[UIApplication statusBarOrientation]  
    2. PID: 22810, TID466328, Thread name: (none), Queue name: WriteLogQueue, QoS0  
    3. Backtrace:  
    4. 4   Numerology                          0x0000000107a99468 -[SSDKContext screenResolution] + 88  
    5. 5   Numerology                          0x0000000107aae942 +[SSDKLog encryptDeviceString] + 390  
    6. 6   Numerology                          0x0000000107aa6900 __28-[SSDKRunLog getLogContent:]_block_invoke + 59  
    7. 7   Numerology                          0x0000000107aae769 -[SSDKLog getLogContent:] + 654  
    8. 8   Numerology                          0x0000000107aa68a6 -[SSDKRunLog getLogContent:] + 127  
    9. 9   Numerology                          0x0000000107ac9523 __28-[SSDKLogService sendRunLog]_block_invoke + 138  
    10. 10  libdispatch.dylib                   0x00000001115df3f7 _dispatch_call_block_and_release + 12  
    11. 11  libdispatch.dylib                   0x00000001115e043c _dispatch_client_callout + 8  
    12. 12  libdispatch.dylib                   0x00000001115e895b _dispatch_queue_serial_drain + 1162  
    13. 13  libdispatch.dylib                   0x00000001115e92df _dispatch_queue_invoke + 336  
    14. 14  libdispatch.dylib                   0x00000001115e507d _dispatch_queue_override_invoke + 733  
    15. 15  libdispatch.dylib                   0x00000001115ec1f9 _dispatch_root_queue_drain + 772  
    16. 16  libdispatch.dylib                   0x00000001115ebe97 _dispatch_worker_thread3 + 132  
    17. 17  libsystem_pthread.dylib             0x0000000111a9c5a2 _pthread_wqthread + 1299  
    18. 18  libsystem_pthread.dylib             0x0000000111a9c07d start_wqthread + 13  

    解决方法: 取消勾选部分




    5.  关于嵌套tableview后,刷新列表,导致列表向上偏移的问题

    原因: iOS 8  引入了Self-Sizing后,我们可以通过estimatedRowHeight来估算每个cell的高度。iOS11 Self-Sizing 默认开启,estimatedRowHeight会由之前的 0 改变为UITableViewAutomaticDimension, 之前项目中,没有使用estimatedRowHeight,在刷新列表的时候,会重新计算 contentSize,进而影响到contentOffSet

    解决方法: 
    [objc] view plain copy
    1. tableView.estimatedRowHeight = 0.0  
    2. tableView.estimatedSectionFooterHeight = 0.0  
    3. tableView.estimatedSectionHeaderHeight = 0.0  


    6. 关于iOS 11 新特性: 大标题prefersLargeTitles

    显示大标题 

    [objc] view plain copy
    1. navigationController.navigationBar.prefersLargeTitles = true  
    修改大标题颜色,字号等

    [objc] view plain copy
    1. navigationController.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.orange,  
    2.                                                                                 NSAttributedStringKey.font: UIFont.systemFont(ofSize: 36)]  
    大标题显示样式

    [objc] view plain copy
    1. navigationItem.largeTitleDisplayMode = .automatic  

    此处说明一下显示样式,默认显示样式为automatic:由前一个界面的设置的显示样式决定。 always:不管其他界面,如何设置,当前只要设置样式为always,则一直显示大标题,不会因界面滚动而显示小标题。  never:与always相反,一直显示小标题


    如果想看更多 Swift 相关的文章可以去 LJ_Y 的博客转一转,此文章也转自其博客:

    https://blog.csdn.net/a645258072/article/details/78040849


    展开全文
  • 每年的WWDC大会都激动和紧张好一段时间。...在这里跟大家分享一下适配iOS 11和iPhone X的过程中,遇到了一些坑。一、导航栏在解释导航栏变化之前先解释一个iOS 11的新特性:设置大标题,通过BOOL类型的prefersLarg

    每年的WWDC大会都激动和紧张好一段时间。激动的是期待苹果的新产品带来的那些黑科技,尤其今年的iPhone10周年纪念款iPhone X。紧张的当然是iOS、Swift和Xcode的升级,又要加班了(ㄒoㄒ)。在这里跟大家分享一下适配iOS 11和iPhone X的过程中,遇到了一些坑。

    一、导航栏

    在解释导航栏变化之前先解释一个iOS 11的新特性:设置大标题,通过BOOL类型的prefersLargeTitles属性来设置。默认设置是不开启。

    //显示大标题“设置”
    
    self.navigationController.navigationBar.prefersLargeTitles = YES;
    
    self.navigationItem.title = @"设置";

    1
    其中LargeTitle还有三种样式可以选择:

    UINavigationItemLargeTitleDisplayModeNever//总是显示小标题
    
    UINavigationItemLargeTitleDisplayModeAlways//总是显示大标题
    
    UINavigationItemLargeTitleDisplayModeAutomatic//自动显示大标题或小标题。即初始时是大标题,滑动时大标题隐藏、显示小标题。

    通过navigationItem的largeTitleDisplayMode属性来设置:

    self.navigationItem.largeTitleDisplayMode =  UINavigationItemLargeTitleDisplayModeAutomatic;

    当然,只有当prefersLargeTitles为YES时largeTitleDisplayMode属性才生效。

    1、导航栏高度变化

    iOS 11之前导航栏默认高度为64pt(statusBar + NavigationBar),iOS11之后如果设置了prefersLargeTitles = YES则为96pt,默认情况下还是64pt。由于iPhoneX上出现了“刘海”,statusBar由以前的20pt变成了44pt,所以iPhoneX上高度变为88pt。

    2、导航栏图层变化

    iOS 11之前导航栏的title是添加在UINavigationItemView上面的,而navigationBarButton则是直接条件在navigationBar上面。如果设置了titleView,那么titleView也是直接添加在navigationBar上面的。
    2

    iOS 11之后,视图层级发生了变化,增添了新的管理类。navigationBar会添加在_UIButtonBarStackView上面,而_UIButtonBarStackView则添加在_UINavigationBarContentView上面。
    如果没有给titleView赋值,那么titleView会直接添加在_UINavigationBarContentView上面;如果赋值了titlev,那么titleview会添加在_UITAMICAdaptorView上面,_UITAMICAdaptorView会添加在_UINavigationBarContentView上面。
    3

    这里写图片描述

    所以如果你的项目是自定义的navigationBar,那么在iOS11上运行就可能出现布局错乱的bug,解决办法是重写UINavigationBar的layoutSubviews方法,调整布局。

    - (void)layoutSubviews {
        [super layoutSubviews];
    
        //注意导航栏及状态栏高度适配
        self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), naviBarHeight);
        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 = statusBarHeight;
                frame.size.height = self.bounds.size.height - frame.origin.y;
                view.frame = frame;
            }
        }
    }

    二、UIScrollView、UITableView、UICollectionView

    在iOS 11之前,如果想要scrollView不偏移64pt,则设置automaticallyAdjustsScrollViewInsets = NO,现在iOS 11设备上运行出现最多问题应该就是tableview莫名奇妙的偏移20pt或者64pt了。原因就是iOS 11弃用了automaticallyAdjustsScrollViewInsets属性,取而代之的是UIScrollView新增的contentInsetAdjustmentBehavior属性。最终还是因为iOS 11新添了safeArea。

    另外,tableView的sectionHeader、sectionFooter高度与设置不符的问题,因为在iOS 11中如果不实现

    -tableView: viewForHeaderInSection:
    -tableView: viewForFooterInSection:

    则不会被调用

    -tableView: heightForHeaderInSection:
    - tableView: heightForFooterInSection:

    导致sectionHeader、sectionFooter的高度都变成了默认高度。
    iOS 11之前,设置sectionHeader、sectionFooter高度为0时,需要设置height=0.1,才会起作用,如果直接设置为0,则会使用默认高度。在iOS 11中默认使用Self-Sizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension,解决办法简单粗暴,就是实现对应方法或把这三个属性设为0。

    如果你使用了Masonry,那么你需要适配safeArea

    if (@available(iOS 11.0, *)) {
        make.edges.equalTo()(self.view.safeAreaInsets)
    } else {
        make.edges.equalTo()(self.view)
    }
    展开全文
  • 方案一 参考博客: Xcode11新变化:SceneDelegate iOS13 Scene Delegate详解 iOS 13 SceneDelegate适配


    在Xcode11上新建一个iOS的带storyboard的项目

    最低适配的系统改到iOS13以下后

    在这里插入图片描述

    解决方案一:删除SceneDelegate,还原到iOS13以前的版本(本人亲测可行)

    1.给AppDelegate添加window属性
    2.注释掉AppDelegate中UISceneSession Lifecycle下面的两个代理方法
    在这里插入图片描述
    3.删除Info.plist中的Application Scene Manifest字段
    在这里插入图片描述
    4.删掉SceneDelegate.swift文件
    在这里插入图片描述
    5.在AppDelegate中把之前的几个代理方法写回来在这里插入图片描述

    AppDelegate中的代码

    //
    //  AppDelegate.swift
    //  MySceneDelegate
    //
    //  Created by macvivi on 2020/6/9.
    //  Copyright © 2020 macvivi. All rights reserved.
    //
    
    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        
        var window: UIWindow?
        
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            return true
        }
        
        // MARK: UISceneSession Lifecycle
        
        //    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        //        // Called when a new scene session is being created.
        //        // Use this method to select a configuration to create the new scene with.
        //        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
        //    }
        //
        //    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        //        // Called when the user discards a scene session.
        //        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        //        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
        //    }
        
        
        func applicationWillResignActive(_ application: UIApplication) {
            // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
            // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
        }
        
        func applicationDidEnterBackground(_ application: UIApplication) {
            
            // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
            // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        }
        
        func applicationWillEnterForeground(_ application: UIApplication) {
            // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
        }
        
        func applicationDidBecomeActive(_ application: UIApplication) {
            // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        }
        
        func applicationWillTerminate(_ application: UIApplication) {
            
            
            // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        }
        
        
        
    }
    
    
    

    方案二:iOS13以上系统使用SceneDelegate,iOS13以下系统不使用SceneDelegate(本人还未测试)

    参考博客:
    Xcode11新变化:SceneDelegate

    其他参考博客:

    iOS13 Scene Delegate详解

    iOS 13 SceneDelegate适配

    展开全文
  • iOS 11 Swift-导航&状态栏&tableview适配

    千次阅读 2017-10-11 16:11:32
    iOS 11运行项目变成了这个样。。 总结几个点: 1.状态栏重叠,字体颜色需要白色不是黑色。 2.导航栏上移了20个点。 3.tableview 上下都有空白。 开工, 一、首先解决状态栏问题。 1....

    iOS 11运行项目变成了这个样。。



    总结几个点:

    1.状态栏重叠,字体颜色需要白色不是黑色。

    2.导航栏上移了20个点。

    3.tableview 上下都有空白。


    开工,

    一、首先解决状态栏问题。

    1.infoplist中设置View controller-based status bar appearance 值为NO。

    2.在appdelegate中加入UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent;将字体设为白色(没有第一步,第二部没效果)。

    OK了


    二、导航栏错位问题

    我的项目是自定义NavigationBar,会出现这个问题。使用系统的NavigationBar不会有这个问题。需要重写下NavigationBar中的layoutSubviews方法。

    先上OC的代码,百度这个问题的时候各位前辈给出的答案。

     for (UIView *view in self.subviews) {
                if([NSStringFromClass([view class]) containsString:@"Background"]) {
                    view.frame = self.bounds;
                }
                else if (NSStringFromClass(view) containsString:@"ContentView"]) {
                    let frame = view.frame;
                    frame.origin.y = statusBarHeight;
                    frame.size.height = self.bounds.size.height - frame.origin.y;
                    view.frame = frame;
                }

    原理是

    1.遍历NavigationBar所有的子视图

    2.通过类名找出下面这两个东西,具体可以看看项目的层级关系

    <_UIBarBackground: 0x7ff38043a320; frame = (0 0; 320 44); userInteractionEnabled = NO; layer = <CALayer: 0x60000023ac80>>
    <_UINavigationBarContentView: 0x7ff38043add0; frame = (0 0; 320 44); layer = <CALayer: 0x60000023ad80>>
    3.更改相应的frame

    Swift代码

    override func layoutSubviews() {
            super.layoutSubviews();
                //注意导航栏及状态栏高度适配
            frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
            for view in subviews {
                let viewbg = subviews[0];//_UIBarBackground
                let viewcon = subviews[2];//_UINavigationBarContentView
                print(view);
                if(view == viewbg){
                    view.frame = bounds;
                }else if(view == viewcon){
                    var frame = view.frame;
                    frame.origin.y = 20;
                    frame.size.height = self.bounds.size.height - frame.origin.y;
                    view.frame = frame;
                }
            }
        }

    注:Swift中试了很久没找到把对象的类名以字符串表示的方法,所以就做不了比对。只能把子视图调出来进行比对。请大牛指教。。

    这样导航和状态栏就OK了

    三、tableview

    1.automaticallyAdjustsScrollViewInsets = false;被废弃了

    VC代码中写下面三句,为了兼容11以下的版本需要加上automaticallyAdjustsScrollViewInsets。

    extendedLayoutIncludesOpaqueBars = true;
    edgesForExtendedLayout = .top;
    automaticallyAdjustsScrollViewInsets = false;

    2.tableview中加入下面代码

    if #available(iOS 11.0, *) {
                tableview?.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.never
            } else {
                // Fallback on earlier versions
            };

    3.iOS 11中如果不实现-tableView: viewForFooterInSection: 和 -tableView: viewForHeaderInSection:,那么-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不会被调用。需要增加下面方法。

    //  tableview 底部视图
        func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
            return nil;
        }
        //  tableview 头部视图
        func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            return nil;
        }

    搞定了~





    展开全文
  • Xcode11提前适配iOS14 IDFA,并打包上线

    千次阅读 2020-08-14 15:58:46
    背景: ...针对Xcode12 Beta版不能打包上架,以及Xcode11无法使用AppTrackingTransparency系统库的问题,帮助开发者提前适配iOS 14 IDFA,是本文要解决的问题。 一、变化 iOS 14 Apple对隐私增加了
  • 用xcode11.5 创建的swift 工程,用模拟器运行一切正常,真机是iOS10 的系统版本,发现运行不了,报了一堆的错 这是因为现在多了一个SceneDelegate.swift,启动完成后在这里创建应用视图 1.解决视图报错,Scene...
  • 实例适配ios11

    2018-01-19 17:31:38
    不多bb,上码 #import "ViewController.h" #import "PersonViewModel.h" #import "Person.h" #import "ShowTableViewCell.h" #import #import ...@interface ViewController ()UITableViewDelegate,...
  • 适配ios10实践经验swift3.0升级

    千次阅读 2016-10-25 14:51:03
    适配ios10实践经验swift3.0升级
  • iOS11下自定义按钮图片不显示 iOS12下图片为白色,改不了颜色 想用系统原生的方案解决问题 那您就继续往下看 iOS 11 新增了两个方法,个人觉得比原先的方法好用多了,不用手动控制 tableView 的 edit,当滑动时会...
  • 1、所有的方法函数都加上 IOS 13 SDK available 2、修改部分Pod的构造器 3、不能直接调试
  • Swift 优雅的适配大小

    2018-11-01 23:07:48
    在日常开发中常常会对设备进行一定的适配,为了方便在多个项目里统一管理和使用,所以封装并开源了SwiftyFitsize这个库,可用于适配视图及字体大小 GitHub: SwiftyFitsize 最终的效果如下图所示 安装 使用...
  • iOS11新特性,如何适配iOS11

    万次阅读 2017-10-10 10:32:31
    这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配。本文作为一个总结。 本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 ...
  • iOS 13 如期而至,虽然正式版还没出来,但是适配工作可以开展起来啦。在适配 iOS 13 过程中,遇到了如下一些问题。 1. UITextField 的私有属性 _placeholderLabel 被禁止访问了 遇到的第一个崩溃是修改UITextField...
  • 正在学习swift的Core Data,做个笔记,顺便分享源码 这个实例是一个很简单的Table,通过右上角的Add按钮可以添加新的用户名。数据存储在CoreData中,这样,才不会丢失。 通过这个例子可以学会: 使用Xcode的model...
  • I、 适配第三方库在iOS...II、 适配iOS13UI控件的API :(涉及的模块有登录) 2.1)UITextField的_placeholderLabel属性:无法直接访问_placeholderLabel.textColor 解决方案: 使用 NSMutableAttributedString 富文本...
  • iOS 13 黑暗模式总结探索 暗黑模式苹果开发文档 如何不进行系统切换样式的适配 注意 同一工程内多个Assets文件在打包后,就会生成一个Assets.car 文件,所以要保证Assets内资源文件的名字不能相同 苹果官方...
  • 项目中友盟推送适配iOS10

    千次阅读 2017-10-18 10:59:25
    当然适配iOS10是必然的,这里就说一下。(声明:当前项目中用的是友盟推送) 对于客户端来说,推送有三种情况:1.程序在前台运行 2.程序在后台运行 3.程序不在运行 先看下本人在iOS10之前的推送代码: 当程
  • iOS 开发 : 14个技巧助你适配 iOS10 1.Notification(通知)  自从 Notification 被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这...
  • iOS11适配

    2018-08-21 10:38:14
    iOS11适配 一. 在UIKit’s Bars中加入的新功能 WWDC通过iOS新增的文件管理App:Files开始介绍,在Files这个APP中能够看到iOS11中UIKit’s Bars的一些新特性:在浏览功能上的大标题视图(向上滑动后标题会回到...
1 2 3 4 5 ... 20
收藏数 4,385
精华内容 1,754
关键字:

11适配 ios swift