swift 好看的动态启动页面_swift 动态启动图 - CSDN
  • 最近使用swift语言制作的应用使用了动态启动界面,先来看看效果吧: 首先,启动图只可以设置一张静态图片,而动态效果是在 “didFinishLaunchingWithOptions” 中执行的动画。 首先我试用了LaunchScreen,并再其中...

    最近使用swift语言制作的应用使用了动态启动界面,先来看看效果吧:
    这里写图片描述

    首先,启动图只可以设置一张静态图片,而动态效果是在 “didFinishLaunchingWithOptions” 中执行的动画。
    首先我试用了LaunchScreen,并再其中设置了静态的启动图片

    这里写图片描述

    之后倒入了3张需要执行动画的图片素材

    这里写图片描述

    下一步就要在AppDelegate中 didFinishLaunchingWithOptions:方法里执行动画效果了:

        var blueView: UIImageView!
        var redView: UIImageView!
        var purpleView: UIImageView!
    
        let animationDuration = 0.8
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
            self.window?.backgroundColor = UIColor.blackColor()
    
            //下面这句一定得加上,否则不会有任何动画
            self.window?.makeKeyAndVisible() 
    
            let originalFrame = CGRectMake(-kWidth/2, 0, kWidth*2, kHeight)
    
            redView = UIImageView(frame: originalFrame)
            redView.contentMode = .ScaleAspectFill
            redView.image = UIImage(named: "redPart")
            self.window?.addSubview(redView)
    
            purpleView = UIImageView(frame: originalFrame)
            purpleView.contentMode = .ScaleAspectFill
            purpleView.image = UIImage(named: "purplePart")
            self.window?.addSubview(purpleView)
    
    
            blueView = UIImageView(frame: originalFrame)
            blueView.contentMode = .ScaleAspectFill
            blueView.image = UIImage(named: "bluePart")
            self.window?.addSubview(blueView)
    
                    UIView.animateWithDuration(animationDuration, animations: { () -> Void in
                self.redView.frame = CGRectMake(0, 0, kWidth*2, kHeight)
                self.redView.alpha = 0
                self.purpleView.frame = CGRectMake(-kWidth, 0, kWidth*2, kHeight)
                self.purpleView.alpha = 0
                self.blueView.frame = CGRectMake(-kWidth/2, kHeight, kWidth*2, kHeight)
                self.blueView.alpha = 0
    
                self.window?.backgroundColor = UIColor.whiteColor()
    
                }) { (bool) -> Void in
                self.redView.removeFromSuperview()
                self.purpleView.removeFromSuperview()
                self.blueView.removeFromSuperview()
            }
    

    虽然苹果不建议使用复杂的启动界面,但很多应用的动态效果几乎都是这种思路。

    展开全文
  • iOS - 制作Swift动态

    2018-08-27 17:30:30
    动态动态库即动态链接库(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会...

    动态库

    动态库即动态链接库(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。

    iOS FrameWork

    在 iOS 8 之前,iOS 平台不支持使用动态 Framework,开发者可以使用的 Framework 只有苹果自家的 UIKit.Framework,Foundation.Framework 等,iOS 8/Xcode 6 推出之后,iOS 平台添加了动态库的支持

    创建动态库

    打开Xcode,Command+Shift+N创建新工程,选择 Cocoa Touch Framework,语言选择Swift

    暴露接口

    对于那些需要暴露出来,即在框架外部也能访问使用的类、方便、变量前面需要加上关键字 Public

    编译动态库

    command+B编译成功,在Products文件下出现XXX.framework文件

    使用动态库

    如果把某个自己开发的动态库Add在Linked Frameworks and Libraries里,程序一启动就会报Reason: Image Not Found,你只能把它放在Embeded Binaries里面才能正常使用。为什么呢?因为加在EmbededBinaries里面的东西其实会被复制一份到xx.app里面(直译就是嵌入的框架)

    存在的问题:在动态库中不能使用静态库

    造成这个的主要原因是Swift的运行时库(不等同于OC的runtime概念),由于Swift的ABI不稳定,静态库会导致最终的目标程序中包含重复的运行库,相关可以看下最后的参考文章SwiftInFlux#static-libraries

    临时解决办法:动态库中有需要依赖静态库的swift文件/页面,都通过闭包的方式回调到主工程中

    CocoaPods使用Use_framework!

    对于 Swift 项目,CocoaPods 提供了动态 Framework 的支持,通过 use_frameworks! 选项控制。

     

    展开全文
  • Swift 引导页

    2018-07-17 10:46:57
    let imageGifArray = ["guideImage5.jpg","adImage4.gif","guideImage7.gif"... let guideView = WYGuidePageView.init(images: imageGifA
     let imageGifArray = ["guideImage5.jpg","adImage4.gif","guideImage7.gif","guideImage3.jpg", "shopping.gif"]
    
       let guideView = WYGuidePageView.init(images: imageGifArray, loginRegistCompletion: {
            print("登录/注册")
        }) {
            print("开始使用app")
        }
    
        self.view.addSubview(guideView)

    这里写图片描述
    GitHub:WYGuidePageView

    展开全文
  • 这个是一个可爱的登录框页面,动画效果仿自国外网站readme.io。在GitHub上有人写了个objective-C版本,这里我翻译成Swift版的分享给大家。 效果图如下: (1)当输入用户名时,猫头鹰的手是搭在登录框上...
    这个是一个可爱的登录框页面,动画效果仿自国外网站readme.io。在GitHub上有人写了个objective-C版本,这里我翻译成Swift版的分享给大家。
    

    效果图如下:
    (1)当输入用户名时,猫头鹰的手是搭在登录框上
    (2)当输入密码时,猫头鹰的手会遮住眼睛。这个是有动画效果的。实现方式其实就是图片移动动画。
    (3)离开密码框时,猫头鹰手又会放下。
    原文:Swift - 一个纯代码实现的登录界面(带猫头鹰动画效果)  原文:Swift - 一个纯代码实现的登录界面(带猫头鹰动画效果)  原文:Swift - 一个纯代码实现的登录界面(带猫头鹰动画效果)

    动态效果如下:
    原文:Swift - 一个纯代码实现的登录界面(带猫头鹰动画效果)


    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    import UIKit
     
    class ViewControllerUIViewControllerUITextFieldDelegate {
        //用户密码输入框
        var txtUser:UITextField!
        var txtPwd:UITextField!
         
        //左手离脑袋的距离
        var offsetLeftHand:CGFloat = 60
         
        //左手图片,右手图片(遮眼睛的)
        var imgLeftHand:UIImageView!
        var imgRightHand:UIImageView!
         
        //左手图片,右手图片(圆形的)
        var imgLeftHandGone:UIImageView!
        var imgRightHandGone:UIImageView!
         
        //登录框状态
        var showType:LoginShowType LoginShowType.NONE
     
        override func viewDidLoad() {
            super.viewDidLoad()
             
            //获取屏幕尺寸
            let mainSize = UIScreen.mainScreen().bounds.size
             
            //猫头鹰头部
            let imgLogin =  UIImageView(frame:CGRectMake(mainSize.width/2-211/2, 100, 211, 109))
            imgLogin.image = UIImage(named:"owl-login")
            imgLogin.layer.masksToBounds = true
            self.view.addSubview(imgLogin)
             
            //猫头鹰左手(遮眼睛的)
            let rectLeftHand = CGRectMake(61 - offsetLeftHand, 90, 40, 65)
            imgLeftHand = UIImageView(frame:rectLeftHand)
            imgLeftHand.image = UIImage(named:"owl-login-arm-left")
            imgLogin.addSubview(imgLeftHand)
             
            //猫头鹰右手(遮眼睛的)
            let rectRightHand = CGRectMake(imgLogin.frame.size.width / 2 + 60, 90, 40, 65)
            imgRightHand = UIImageView(frame:rectRightHand)
            imgRightHand.image = UIImage(named:"owl-login-arm-right")
            imgLogin.addSubview(imgRightHand)
             
            //登录框背景
            let vLogin =  UIView(frame:CGRectMake(15, 200, mainSize.width - 30, 160))
            vLogin.layer.borderWidth = 0.5
            vLogin.layer.borderColor = UIColor.lightGrayColor().CGColor
            vLogin.backgroundColor = UIColor.whiteColor()
            self.view.addSubview(vLogin)
             
            //猫头鹰左手(圆形的)
            let rectLeftHandGone = CGRectMake(mainSize.width / 2 - 100,
                vLogin.frame.origin.y - 22, 40, 40)
            imgLeftHandGone = UIImageView(frame:rectLeftHandGone)
            imgLeftHandGone.image = UIImage(named:"icon_hand")
            self.view.addSubview(imgLeftHandGone)
             
            //猫头鹰右手(圆形的)
            let rectRightHandGone = CGRectMake(mainSize.width / 2 + 62,
                vLogin.frame.origin.y - 22, 40, 40)
            imgRightHandGone = UIImageView(frame:rectRightHandGone)
            imgRightHandGone.image = UIImage(named:"icon_hand")
            self.view.addSubview(imgRightHandGone)
             
            //用户名输入框
            txtUser = UITextField(frame:CGRectMake(30, 30, vLogin.frame.size.width - 60, 44))
            txtUser.delegate = self
            txtUser.layer.cornerRadius = 5
            txtUser.layer.borderColor = UIColor.lightGrayColor().CGColor
            txtUser.layer.borderWidth = 0.5
            txtUser.leftView = UIView(frame:CGRectMake(0, 0, 44, 44))
            txtUser.leftViewMode = UITextFieldViewMode.Always
             
            //用户名输入框左侧图标
            let imgUser =  UIImageView(frame:CGRectMake(11, 11, 22, 22))
            imgUser.image = UIImage(named:"iconfont-user")
            txtUser.leftView!.addSubview(imgUser)
            vLogin.addSubview(txtUser)
             
            //密码输入框
            txtPwd = UITextField(frame:CGRectMake(30, 90, vLogin.frame.size.width - 60, 44))
            txtPwd.delegate = self
            txtPwd.layer.cornerRadius = 5
            txtPwd.layer.borderColor = UIColor.lightGrayColor().CGColor
            txtPwd.layer.borderWidth = 0.5
            txtPwd.secureTextEntry = true
            txtPwd.leftView = UIView(frame:CGRectMake(0, 0, 44, 44))
            txtPwd.leftViewMode = UITextFieldViewMode.Always
             
            //密码输入框左侧图标
            let imgPwd =  UIImageView(frame:CGRectMake(11, 11, 22, 22))
            imgPwd.image = UIImage(named:"iconfont-password")
            txtPwd.leftView!.addSubview(imgPwd)
            vLogin.addSubview(txtPwd)
        }
         
        //输入框获取焦点开始编辑
        func textFieldDidBeginEditing(textField:UITextField)
        {
            //如果当前是用户名输入
            if textField.isEqual(txtUser){
                if (showType != LoginShowType.PASS)
                {
                    showType = LoginShowType.USER
                    return
                }
                showType = LoginShowType.USER
                 
                //播放不遮眼动画
                UIView.animateWithDuration(0.5, animations: { () -> Void in
                    self.imgLeftHand.frame = CGRectMake(
                        self.imgLeftHand.frame.origin.x - self.offsetLeftHand,
                        self.imgLeftHand.frame.origin.y + 30,
                        self.imgLeftHand.frame.size.width, self.imgLeftHand.frame.size.height)
                    self.imgRightHand.frame = CGRectMake(
                        self.imgRightHand.frame.origin.x + 48,
                        self.imgRightHand.frame.origin.y + 30,
                        self.imgRightHand.frame.size.width, self.imgRightHand.frame.size.height)
                    self.imgLeftHandGone.frame = CGRectMake(
                        self.imgLeftHandGone.frame.origin.x - 70,
                        self.imgLeftHandGone.frame.origin.y, 40, 40)
                    self.imgRightHandGone.frame = CGRectMake(
                        self.imgRightHandGone.frame.origin.x + 30,
                        self.imgRightHandGone.frame.origin.y, 40, 40)
                })
            }
            //如果当前是密码名输入
            else if textField.isEqual(txtPwd){
                if (showType == LoginShowType.PASS)
                {
                    showType = LoginShowType.PASS
                    return
                }
                showType = LoginShowType.PASS
                 
                //播放遮眼动画
                UIView.animateWithDuration(0.5, animations: { () -> Void in
                    self.imgLeftHand.frame = CGRectMake(
                        self.imgLeftHand.frame.origin.x + self.offsetLeftHand,
                        self.imgLeftHand.frame.origin.y - 30,
                        self.imgLeftHand.frame.size.width, self.imgLeftHand.frame.size.height)
                    self.imgRightHand.frame = CGRectMake(
                        self.imgRightHand.frame.origin.x - 48,
                        self.imgRightHand.frame.origin.y - 30,
                        self.imgRightHand.frame.size.width, self.imgRightHand.frame.size.height)
                    self.imgLeftHandGone.frame = CGRectMake(
                        self.imgLeftHandGone.frame.origin.x + 70,
                        self.imgLeftHandGone.frame.origin.y, 0, 0)
                    self.imgRightHandGone.frame = CGRectMake(
                        self.imgRightHandGone.frame.origin.x - 30,
                        self.imgRightHandGone.frame.origin.y, 0, 0)
                })
            }
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
     
    //登录框状态枚举
    enum LoginShowType {
        case NONE
        case USER
        case PASS
    }
    源码下载:hangge_926.zip
    原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_927.html
    展开全文
  • WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的: Frameworks for iOS. iOS developers can now create dynamic ...

    WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的:

    Frameworks for iOS. iOS developers can now create dynamic frameworks. Frameworks are a collection of code and resources to encapsulate functionality that is valuable across multiple projects. Frameworks work perfectly with extensions, sharing logic that can be used by both the main application, and the bundled extensions.

    详情见官方文档New Features in Xcode 6 Beta

    framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用,作为一名Cocoa/Cocoa Touch程序员每天都要跟各种各样的Framework打交道。Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework /AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。

    但残忍的是,Cocoa Touch上并不允许我们使用自己创建的framework。不过由于framework是一种优秀的资源打包方式,拥有无穷智慧的程序员们便想出了以 framework的形式打包静态库的招数,因此我们平时看到的第三方发布的framework无一例外都是静态库,真正的动态库是上不了 AppStore的。

    WWDC2014给我的一个很大感触是苹果对iOS的开放态度:允许使用动态库、允许第三方键盘、App Extension等等,这些在之前是想都不敢想的事。

    iOS上动态库可以做什么

    和静态库在编译时和app代码链接并打进同一个二进制包中不同,动态库可以在运行时手动加载,这样就可以做很多事情,比如:

    • 共享可执行文件

    在其它大部分平台上,动态库都可以用于不同应用间共享,这就大大节省了内存。从目前来看,iOS仍然不允许进程间共享动态库,即iOS上的动态库只能是私有的,因为我们仍然不能将动态库文件放置在除了自身沙盒以外的其它任何地方。

    不过iOS8上开放了App Extension功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。

    2014-6-23修正:

    @唐巧_boy提醒,sandbox会验证动态库的签名,所以如果是动态从服务器更新的动态库,是签名不了的,因此应用插件化、软件版本实时模块升级等功能在iOS上无法实现。

    创建动态库

    1、创建动态库

    • 创建工程文件

    在下图所示界面能够找到Cocoa Touch动态库的创建入口:

    framework

    跟随指引一步步操作即可创建一个新的动态库工程,我的工程名字叫Dylib,Xcode会同时创建一个和工程target同名的.h文件,比如我的就是Dylib.h。

    • 向工程中添加文件

    接下来就可以在工程中随意添加文件了。我在其中新建了一个名为Person的测试类,提供的接口如下:

    1
    2
    3
    4
    5
    
    @interface Person : NSObject
    
    - (void)run;
    
    @end
    

    对应的实现部分:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    @implementation Person
    
    - (void)run
    {
        NSLog(@"let's run.");
    
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"The Second Alert" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"done", nil];
        [alert show];
    }
    
    @end
    
    • 设置开放的头文件

    一个库里面可以后很多的代码,但是我们需要设置能够提供给外界使用的接口,可以通过Target—>Build Phases—>Headers来设置,如下图所示:

    header

    我们只需将希望开放的头文件放到Public列表中即可,比如我开放了Dylib.hPerson.h两个头文件,在生成的framework的Header目录下就可以看到这两个头文件,如下图所示:

    public_header

    一切完成,Run以后就能成功生成framework文件了。

    2、通用动态库

    经过第一步我们只是创建了一个动态库文件,但是和静态库类似,该动态库并同时不支持真机和模拟器,可以通过以下步骤创建通用动态库:

    • 创建Aggregate Target

    按下图所示,在动态库工程中添加一个类型为Aggregate的target:

    aggregate

    按提示一步步操作即可,我给Aggregate的Target的命名是CommonDylib

    • 设置Target Dependencies

    按以下路径设置CommonDylib对应的Target Dependencies:

    1
    
    TARGETS-->CommonDylib-->Build Phases-->Target Dependencies
    

    将真正的动态库Dylib Target添加到其中。

    • 添加Run Script

    按以下路径为CommonDylib添加Run Script:

    1
    
    TARGETS-->CommonDylib-->Build Phases-->Run Script
    

    添加的脚本为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    # Sets the target folders and the final framework product.
    FMK_NAME=${PROJECT_NAME}
    
    # Install dir will be the final output to the framework.
    # The following line create it in the root folder of the current project.
    INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
    
    # Working dir will be deleted after the framework creation.
    WRK_DIR=build
    DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
    SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
    
    # -configuration ${CONFIGURATION} 
    # Clean and Building both architectures.
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
    
    # Cleaning the oldest.
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    
    mkdir -p "${INSTALL_DIR}"
    
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    
    # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
    lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
    
    rm -r "${WRK_DIR}"
    

    添加以后的效果如图所示:

    commonlib_setting

    该脚本是我根据一篇文章中介绍的脚本改写的,感谢原文作者

    脚本的主要功能是:

    1.分别编译生成真机和模拟器使用的framework; 2.使用lipo命令将其合并成一个通用framework; 3.最后将生成的通用framework放置在工程根目录下新建的Products目录下。

    如果一切顺利,对CommonDylib target执行run操作以后就能生成一个如图所示的通用framework文件了:

    products

    使用动态库

    添加动态库到工程文件

    经过以上步骤的努力,生成了最终需要的framework文件,为了演示动态库的使用,新建了一个名为FrameworkDemo的工程。通过以下方式将刚生成的framework添加到工程中:

    1
    
    Targets-->Build Phases-->Link Binary With Libraries
    

    同时设置将framework作为资源文件拷贝到Bundle中:

    1
    
    Targets-->Build Phases-->Copy Bundle Resources
    

    如图所示:

    framework_demo_setting

    仅仅这样做是不够的,还需要为动态库添加链接依赖。

    自动链接动态库

    添加完动态库后,如果希望动态库在软件启动时自动链接,可以通过以下方式设置动态库依赖路径:

    1
    
    Targets-->Build Setting-->Linking-->Runpath Search Paths
    

    由于向工程中添加动态库时,将动态库设置了Copy Bundle Resources,因此就可以将Runpath Search Paths路径依赖设置为main bundle,即沙盒中的FrameworkDemo.app目录,向Runpath Search Paths中添加下述内容:

    1
    
    @executable_path/
    

    如图所示:

    run_search_path

    其中的@executable_path/表示可执行文件所在路径,即沙盒中的.app目录,注意不要漏掉最后的/

    如果你将动态库放到了沙盒中的其他目录,只需要添加对应路径的依赖就可以了。

    需要的时候链接动态库

    动态库的另一个重要特性就是即插即用性,我们可以选择在需要的时候再加载动态库。

    • 更改设置

    如果不希望在软件一启动就加载动态库,需要将

    1
    
    Targets-->Build Phases-->Link Binary With Libraries
    

    Dylib.framework对应的Status由默认的Required改成Optional;或者更干脆的,将Dylib.frameworkLink Binary With Libraries列表中删除即可。

    • 使用dlopen加载动态库

    Dylib.framework为例,动态库中真正的可执行代码为Dylib.framework/Dylib文件,因此使用dlopen时如果仅仅指定加载动态库的路径为Dylib.framework是没法成功加载的。

    示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    - (IBAction)onDlopenLoadAtPathAction1:(id)sender
    {
        NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/Dylib.framework/Dylib",NSHomeDirectory()];
        [self dlopenLoadDylibWithPath:documentsPath];
    }
    
    - (void)dlopenLoadDylibWithPath:(NSString *)path
    {
        libHandle = NULL;
        libHandle = dlopen([path cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);
        if (libHandle == NULL) {
            char *error = dlerror();
            NSLog(@"dlopen error: %s", error);
        } else {
            NSLog(@"dlopen load framework success.");
        }
    }
    

    以dlopen方式使用动态库不知道是否能通过苹果审核。

    • 使用NSBundle加载动态库

    也可以使用NSBundle来加载动态库,实现代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    - (IBAction)onBundleLoadAtPathAction1:(id)sender
    {
        NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/Dylib.framework",NSHomeDirectory()];
        [self bundleLoadDylibWithPath:documentsPath];
    }
    
    - (void)bundleLoadDylibWithPath:(NSString *)path
    {
        _libPath = path;
        NSError *err = nil;
        NSBundle *bundle = [NSBundle bundleWithPath:path];
        if ([bundle loadAndReturnError:&err]) {
            NSLog(@"bundle load framework success.");
        } else {
            NSLog(@"bundle load framework err:%@",err);
        }
    }
    

    使用动态库中代码

    通过上述任一一种方式加载的动态库后,就可以使用动态库中的代码文件了,以Dylib.framework中的Person类的使用为例:

    1
    2
    3
    4
    5
    6
    7
    8
    
    - (IBAction)onTriggerButtonAction:(id)sender
    {
        Class rootClass = NSClassFromString(@"Person");
        if (rootClass) {
            id object = [[rootClass alloc] init];
            [(Person *)object run];
        }
    }
    

    注意,如果直接通过下属方式初始化Person类是不成功的:

    1
    2
    3
    4
    5
    6
    7
    
    - (IBAction)onTriggerButtonAction:(id)sender
    {
        Person *object = [[Person alloc] init];
        if (object) {
           [object run];
        }
    }
    

    监测动态库的加载和移除

    我们可以通过下述方式,为动态库的加载和移除添加监听回调:

    1
    2
    3
    4
    5
    
    + (void)load
    {
      _dyld_register_func_for_add_image(&image_added);
      _dyld_register_func_for_remove_image(&image_removed);
    }
    

    github上有一个完整的示例代码

    从这里看出,原来就算空白工程软件启动的时候也会加载多达一百二十多个动态库,如果这些都是静态库,那该有多可怕!!

    Demo

    本文使用的例子已经上传到github上,需要的朋友请自取。

    另外,本文对某些东西可能有理解错误的地方,还请指出。

    参考文档:

    转载于:https://www.cnblogs.com/baitongtong/p/10046356.html

    展开全文
  • 本系列是Swift官方入门教程的翻译版,含源码,欢迎一起学习Swift
  • iOS之热启动和冷启动

    2019-06-09 11:25:28
    1.热启动:就是按下home键的时候,app还存在一段时间,这时点击app马上就能恢复到原状态,这种启动我们称为热启动。当 APP 启动时需要的 dylibs 仍然停留在设备的磁盘缓存的时候,这个时候就是热启动,热启动的速度会...
  • 其实原理也是很简单,启动页还是运用Launch Images Source的内容,然后在做一个视图在最上层,视图的背景用启动项的那张图,让人误以为还在启动中,启动页加载完成后,就显示这层视图,在2秒后再把这层视图删除,...
  • Swift 项目的模块化

    2019-03-06 00:04:01
    这篇博客是对最近在新启动的公司Swift为基础语言的项目中,对于整个项目架构的一些尝试的整理。 Swift是一门静态的强类型语言,虽然可以在Cocoa框架下开发可以使用Objective-C的Runtime,但在我看来,既然选用了全新...
  • App 启动时间过长,可能有多个原因造成的,从理论上说App的启动时间是由mian()函数之前的加载时间(t1)和mian函数之后的加载时间(t2)组成的 关于t1 需要分析App 启动日志,具体方法是在Xcode 添加 DYLD_PRINT_...
  • 使用Swift开发SDK的优点是,生成的SDK对于Obj-C或是Swift调用都不需要自己去建桥接文件,因为Swift的SDK打包时默认已经自动生成供OC调用的.h文件。OC调用时直接import,sdk中的.h文件即可。而Swift调用时,import该...
  • Swift是苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于MAC OS和iOS平台,用于搭建基于苹果平台的应用程序。 2、举例说明Swift里面有哪些是 Objective-C中没有的? Swift...
  • 在APP的启动页经常会有一些渐变效果。如果是从半透明渐变为不透明,用View动画AlphaAnimation就能完成。而View动画只有渐变,旋转,平移,和缩放四种动画效果,是完成不了颜色变化的任务的。所以需要用到属性动画。...
  • Swift关键字总结下篇

    2019-06-03 16:53:35
    Swift 中有多少关键字? 在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中、语句中、表达式中、类中、模式中, 还有以数字符号#开头的关键字, 以及特定上下文环境使用的关键字。本文中涉及的代码...
  • Swift之自定义UITabBarController (Swift项目开始的第一步)
  • 貌似挺长时间没有总结新知识了,最近在看swift,之前swift刚出来的时候大体看了一遍,后来时间长了没看加之swift2.0做了比较大的调整,公司项目也不是用swift写的,也就没怎么看了,谁成想忘的差不多了,趁公司最近项目不忙...
  • 原创Blog,转载请注明出处 ...我的stackoverflow 工欲善其事,必先利其器,强烈建议新手同学好好研究下XCode这个工具。比如Build Settings,Build Info Rules,Build Parse, Edit Scheme… ...图形化界面
  • 问题二:iOS启动页面如何设置多停留一会 新建的iOS 项目启动画面默认为LaunchScreen.xib  如果想实现一张图片作为启动页,如下图 如果启动不行 记得clear 一下工程 是启动页停留一...
  • GitHub上Swift开源项目!

    2017-02-04 19:10:16
    swift-open-project这里汇集了目前为止最为流行的Swift开源项目,选取SwiftGuide中的开源部分,这里将每周对项目进行总结,如果大家有推荐的可以联系thinkloki@gmail.com,或者issues,欢迎Star、Fork。感谢...
  • Swift:UIKit中Demo(二)

    2018-03-10 22:40:33
    这一节,继续为大家提供一个Demo,用来说明Swift中的各种语法及在UIView中的基本使用。效果图如下:看起来,这个Demo非常的简单。但是为了进行详细的语法说明,它的实现,均是用代码实现的,并且下方的进度条都是&...
1 2 3 4 5 ... 20
收藏数 3,317
精华内容 1,326
关键字:

swift 好看的动态启动页面