2016-10-25 14:51:03 opentogether 阅读数 2783

swift语法:

1.UIColor.white

-->UIColor.whiteColor()

focusButton.setTitleColor(UIColor.white, for: UIControlState())


2.        label.font = UIFont.systemFontOfSize(12)

      -->label.font = UIFont.systemFont(ofSize: 12)


if self.childViewControllers.last?.isKindOfClass(DKPersonalLiveViewController) == true

-->if self.childViewControllers.last?.isKind(of: DKPersonalLiveViewController.self)

if ((self.delegate?.respondsToSelector(Selector("tipViewDidClickContinue"))) != false)

-->if ((self.delegate?.responds(to: Selector("tipViewDidClickContinue"))) != false)


3.        layer.frame = CGRectMake(0, 0, self.frame.width, self.backImageView.frame.height)

-->      layer.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.backImageView.frame.height)


4.       label.textAlignment = NSTextAlignment.Center

-->   label.textAlignment = NSTextAlignment.center


5.private

-->fileprivate


6.private lazy var hvClearColor: CGColor = {
        return UIColor(red: 0, green: 0, blue: 0, alpha: 0.0).CGColor
    }()

-->

 fileprivate lazy var hvClearColor: CGColor = {
        return UIColor(red: 0, green: 0, blue: 0, alpha: 0.0).cgColor
    }()


7.ID

-->id(OC语法中,id是范型,不能用id作为变量。所以,swift中的变量都是小写)


8.函数参数如果没有函数名,则,前面需要加横线“_”:

    class func widthFromNum(upNum:Int , fontsize:Float) -> CGFloat 

-->    class func widthFromNum(upNum:Int , fontsize:Float) -> CGFloat 


9.CGRectGetMaxX(headImageView.frame)  

->  headImageView.frame.maxX 


10.

typealias SendIndexClosure=(indexPath:NSIndexPath,direction:UICollectionViewScrollDirection)->Void

-->

typealias SendIndexClosure=(_ indexPath:IndexPath,_ direction:UICollectionViewScrollDirection)->Void


11.

dispatch_async(dispatch_get_main_queue(), {

                self.beginLoading()

            })

->

DispatchQueue.main.async(execute: {

                self.beginLoading()

            })


        dispatch_source_cancel(source!)

->        source!.cancel()



 dispatch_async(dispatch_get_main_queue()) {

            self.dismissViewControllerAnimated(true, completion: nil)

        }

->

DispatchQueue.main.async {

            self.dismiss(animated: true, completion: nil)

        }




2017-12-20 09:57:20 m403180222 阅读数 10545

每年的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)
}
2017-11-11 10:37:48 samuelandkevin 阅读数 864

参考资料:
App界面适配iOS11(包括iPhoneX的奇葩尺寸)
有关iOS11和iPhoneX的适配问题
适配iOS11&iPhoneX的一些坑


判断iPhoneX

swift 判断iPhoneX

extension UIDevice {
    //是否iPhoneX
    public class func isIphoneX() -> Bool {
        if UIScreen.main.bounds.height == 812 {
            return true
        }
        return false
    }
}

OC 判断iPhoneX


@interface UIDevice(extension)

+ (BOOL)isiphoneX;

@end

@implementation UIDevice(extension)

+ (BOOL)isiphoneX{
    if([UIScreen mainScreen].bounds.size.height == 812){
        return YES;
    }else{
        return NO;
    }
}

@end

iOS 11 禁止tableView自动偏移(整体上移或下移)
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

if (@available(iOS 11.0, *)){
         [self.tableView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

解决iPhoneX Push过程中TabBar位置上移方法

封装一个基类UINavigationController,这里名字设置为:MyNavigationController。在MyNavigationController中覆盖父类方法。

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    //适配iPhone X Push过程中TabBar位置上移
    if (self.viewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
    // 修改tabBar的frame
    CGRect frame = self.tabBarController.tabBar.frame;
    frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
    self.tabBarController.tabBar.frame = frame;


}

调整iPhoneX tabbar图标位置

这里引用ESTabbar的关键代码,其实是修改UITabbar的itemPositioning属性。

    public var itemCustomPositioning: ESTabBarItemPositioning? {
        didSet {
            if let itemCustomPositioning = itemCustomPositioning {
                switch itemCustomPositioning {
                case .fill:
                    itemPositioning = .fill
                case .automatic:
                    itemPositioning = .automatic
                case .centered:
                    itemPositioning = .centered
                default:
                    break
                }
            }
            self.reload()
        }
    }
2017-09-20 14:53:06 a645258072 阅读数 4320

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

官方适配标准如下图:


2. UITableview 顶部出现留白

解决方法: 添加以下代码

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return nil
    }
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return nil
    }

3. iOS 11 弃用 automaticAdjustsScrollViewInsets 新增 contentInsetAdjustmentBehavior

        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
        } else {
            self.automaticallyAdjustsScrollViewInsets = false
        }


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

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

解决方法: 
            tableView.estimatedRowHeight = 0.0
            tableView.estimatedSectionFooterHeight = 0.0
            tableView.estimatedSectionHeaderHeight = 0.0


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

显示大标题 

navigationController.navigationBar.prefersLargeTitles = true
修改大标题颜色,字号等

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

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




2018-08-08 12:29:52 ssq940410 阅读数 37

适配iOS 11:

    Swift : 

                if #available(iOS 11.0,*){

                    UIScrollView.appearance().contentInsetAdjustmentBehavior = .never

                } else {

                    self.automaticallyAdjustsScrollViewInsets = false

                }

                使用tableView时 如果出现section头部或尾部间隙过大时,可以对tableView的属性做修改

                if #available(iOS 11.0,*){

                    tableView.estimatedSectionFooterHeight = 0.01

                    tableView.estimatedSectionHeaderHeight = 0.01

                } 

                   

    OC :

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

                    [[UIScrollView appearance]  setContentInsetAdjustmentBehavior: UIScrollViewContentInsetAdjustmentNever];

              } else {

                    self.automaticallyAdjustsScrollViewInsets = NO;

              }

              //对于tableView

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

                    tableView.estimatedSectionFooterHeight = 0.01

                    tableView.estimatedSectionHeaderHeight = 0.01

                } 

 

  iPhone X简单适配:

          配置全屏(1125x2436)的启动图(launchImage)

          部分app可能会出现tableView的headerView或者footerView过大,需要实现DataSource中如下方法

          - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;

          - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

              

                

              

适配iOS13

阅读数 54

适配swift3

阅读数 262

适配swift3

博文 来自: u012297622
没有更多推荐了,返回首页