iOS大杂烩

栏目: IOS · 发布时间: 5年前

内容简介:ios大杂烩用户操作流程: 打开应用 => 按Home回桌面 => 再次打开应用 => 双击Home弹出进程列表 => 划掉应用iOS项目默认有两个StoryBoard,一个叫

ios大杂烩

Hello Objective-C

Hello World

示例代码

# import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Hello, World!");
    }
    return 0;
}

控制台输出

2018-12-22 22:28:44.249 hellooc[1710:8656] Hello, World!

要点

  • #import 不是 #include ,表示不重复包含
  • @autoreleeasepool 表示自动垃圾回收
  • NSLog 表示打印日志
  • 字符串字面量必须前缀以 @ ,表示NSString类型

面向对象的Objective-C

示例代码

//
//  main.m
//  hellooc
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface MyColor : NSObject {
    int red;
    int green;
    int blue;
}

/**
 * #Java: new MyColor(x, y, z)
 *
 * @param aRed
 * @param aGreen
 * @param aBlue
 * @return
 */
- (instancetype)initWithRed:(int)aRed green:(int)aGreen blue:(int)aBlue;

/**
 * #Java: MyColor.newInstance(x, y, z)
 * @param aRed
 * @param aGreen
 * @param aBlue
 * @return
 */
+ (instancetype)colorWithRed:(int)aRed green:(int)aGreen blue:(int)aBlue;


@end

@implementation MyColor

/**
 * # Java: new MyColor()
 * @return
 */
- (instancetype)init {
    self = [super init];
    if (self) {
        red = 1;
        green = 2;
        blue = 3;
    }
    return self;
}

- (instancetype)initWithRed:(int)aRed green:(int)aGreen blue:(int)aBlue {
    self = [super init];
    if (self) {
        red = aRed;
        green = aGreen;
        blue = aBlue;
    }

    return self;
}

+ (instancetype)colorWithRed:(int)aRed green:(int)aGreen blue:(int)aBlue {
    return [[self alloc] initWithRed:aRed green:aGreen blue:aBlue];
}


/**
 * #Java: toString()
 * @return
 */
- (NSString *)description {
    NSMutableString *description = [NSMutableString stringWithFormat:@"<%@: ", NSStringFromClass([self class])];
    [description appendFormat:@"red=%i", red];
    [description appendFormat:@", green=%i", green];
    [description appendFormat:@", blue=%i", blue];
    [description appendString:@">"];
    return description;
}

@end

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        MyColor *myColor;

        NSLog(@"Before initialization:");
        NSLog(@"myColor = %@", myColor);

        myColor = [MyColor new];
        NSLog(@"After initialization of custom constructor:");
        NSLog(@"myColor = %@", myColor);

        myColor = [[MyColor alloc] initWithRed:0 green:255 blue:0];
        NSLog(@"Initialized with custom multiple-parameters constructor:");
        NSLog(@"myColor = %@", myColor);

        myColor = [MyColor colorWithRed:111 green:111 blue:111];
        NSLog(@"Initialized with static method:");
        NSLog(@"myColor = %@", myColor);
    }
    return 0;
}

示例输出

2018-12-22 22:29:17.847 hellooc[1732:8941] Before initialization:
2018-12-22 22:29:17.847 hellooc[1732:8941] myColor = (null)
2018-12-22 22:29:17.847 hellooc[1732:8941] After initialization of custom constructor:
2018-12-22 22:29:17.847 hellooc[1732:8941] myColor = <MyColor: red=1, green=2, blue=3>
2018-12-22 22:29:17.847 hellooc[1732:8941] Initialized with custom multiple-parameters constructor:
2018-12-22 22:29:17.848 hellooc[1732:8941] myColor = <MyColor: red=0, green=255, blue=0>
2018-12-22 22:29:17.848 hellooc[1732:8941] Initialized with static method:
2018-12-22 22:29:17.848 hellooc[1732:8941] myColor = <MyColor: red=111, green=111, blue=111>

要点

  • 类的定义和实现必须分开写,可以写在同一个文件里
  • 对象的初始化可以有两种写法,一种是 [[MyClass alloc] init] ,一种是简写 [MyClass new]
  • 类可以重载init方法,实现自定义构造函数
  • 类可以创建其他示例方法,在 alloc 之后调用它进行初始化
  • 类可以创建静态方法,通过静态方法创建对象
  • NSLog 可以通过格式 %@ 打印对象
  • 类可以重载 description 方法, %@ 格式化对象的时候调用

Hello Cocoa

iOS应用的生命周期

测试代码 AppDelegate.m

//
//  AppDelegate.m
//  hellococoa
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import "AppDelegate.h"


@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSLog(@"[app] didFinishLaunchingWithOptions");
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // 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.
    NSLog(@"[app] applicationWillResignActive");

}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // 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.
    NSLog(@"[app] applicationDidEnterBackground");

}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // 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.
    NSLog(@"[app] applicationWillEnterForeground");
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // 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.
    NSLog(@"[app] applicationDidBecomeActive");
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    NSLog(@"[app] applicationWillTerminate");
}


@end

控制台输出

用户操作流程: 打开应用 => 按Home回桌面 => 再次打开应用 => 双击Home弹出进程列表 => 划掉应用

2018-12-22 23:32:30.685585+0800 hellococoa[2497:25432] libMobileGestalt MobileGestalt.c:890: MGIsDeviceOneOfType is not supported on this platform.
2018-12-22 23:32:30.730883+0800 hellococoa[2497:25432] [app] didFinishLaunchingWithOptions
2018-12-22 23:32:30.737519+0800 hellococoa[2497:25432] [app] applicationDidBecomeActive

2018-12-22 23:32:45.269746+0800 hellococoa[2497:25432] [app] applicationWillResignActive
2018-12-22 23:32:45.844597+0800 hellococoa[2497:25432] [app] applicationDidEnterBackground

2018-12-22 23:32:54.979323+0800 hellococoa[2497:25432] [app] applicationWillEnterForeground
2018-12-22 23:32:55.265910+0800 hellococoa[2497:25432] [app] applicationDidBecomeActive

2018-12-22 23:33:04.389439+0800 hellococoa[2497:25432] [app] applicationWillResignActive

2018-12-22 23:33:19.848464+0800 hellococoa[2497:25432] [app] applicationDidEnterBackground
2018-12-22 23:33:19.851948+0800 hellococoa[2497:25432] [app] applicationWillTerminate

LaunchScreen与Main两个StoryBoard

iOS项目默认有两个StoryBoard,一个叫 LaunchScreen.storyboard ,一个叫 Main.storyboard 。显然,LaunchScreen是开屏界面,Main是主界面。

启动App后,先显示LaunchScreen,然后渐变过度到Main。过度动画大约持续1秒

注意,XCode10的控件库的位置变了,XCode右上角有个专用的 Library 按钮。快捷键 Cmd+Shift+L

移除StoryBoard

步骤:

  1. 直接删除两个StoryBoard文件
  2. 在项目属性(点击导航栏的项目名,进入项目属性页)的 General => Deployment Info 下将 Main interface 置空(本质上是修改项目的plist文件)
  3. 修改 AppDelegate.m ,手动关联AppDelegate与ViewController

示例代码片段:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [UIWindow new];
    self.window.frame = UIScreen.mainScreen.bounds;
    self.window.backgroundColor = [UIColor redColor];

    ViewController *viewController = [[ViewController alloc] init];
    viewController.view.backgroundColor = UIColor.redColor;

    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

注意

  • 如果打开app还有显示StoryBoard的内容。在模拟器里卸载掉app重试
  • AppDelegate 的根Window必须有ViewController,否则报错: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

单文件iOS应用

示例代码

//
//  main.m
//  hellococoa
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController
@end

@implementation MyViewController
@end

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
@property(nonatomic) UIWindow *window;
@end

@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions {
    // 1. Create window
    self.window = [[UIWindow alloc] init];
    self.window.frame = UIScreen.mainScreen.bounds;
    self.window.backgroundColor = [UIColor magentaColor];
    // 2. Bind window to ViewController
    self.window.rootViewController = [[MyViewController alloc] init];
    // 3. Show window
    [self.window makeKeyAndVisible];
    return YES;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

iOS布局

演示: 将屏幕水平均分为两块,这两块的间距和他们相对于屏幕边缘的边距都为10

1. 使用官方的约束布局

示例代码

//
//  main.m
//  hellococoa
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController
@end

@implementation MyViewController
- (void)loadView {
    [super loadView];
    self.view = [[UIView alloc] init];

    UIView *leftView = [[UIView alloc] init];
    UIView *rightView = [[UIView alloc] init];

    leftView.backgroundColor = [UIColor magentaColor];
    rightView.backgroundColor = [UIColor purpleColor];

    leftView.translatesAutoresizingMaskIntoConstraints = NO;
    rightView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:leftView];
    [self.view addSubview:rightView];

    [self.view addConstraints:@[
            // 固定左布局的上、左、下边界
            [NSLayoutConstraint constraintWithItem:leftView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:10],
            [NSLayoutConstraint constraintWithItem:leftView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:10],
            [NSLayoutConstraint constraintWithItem:leftView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-10],
            // 固定右布局的上、右、下边界
            [NSLayoutConstraint constraintWithItem:rightView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:10],
            [NSLayoutConstraint constraintWithItem:rightView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:-10],
            [NSLayoutConstraint constraintWithItem:rightView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-10],
            // 确定左、右布局的相对位置
            [NSLayoutConstraint constraintWithItem:rightView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:leftView attribute:NSLayoutAttributeRight multiplier:1.0 constant:10],
            // 确定左、右布局的相对大小
            [NSLayoutConstraint constraintWithItem:rightView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:leftView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]
    ]];
}

@end

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
@property(nonatomic) UIWindow *window;
@end

@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions {
    // 1. Create window
    self.window = [[UIWindow alloc] init];
    self.window.frame = UIScreen.mainScreen.bounds;
    self.window.backgroundColor = [UIColor grayColor];
    // 2. Bind window to ViewController
    self.window.rootViewController = [[MyViewController alloc] init];
    // 3. Show window
    [self.window makeKeyAndVisible];
    return YES;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"%@", NSStringFromClass([MyAppDelegate class]));
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

注意:

UIView.translatesAutoresizingMaskIntoConstraints

2. 使用官方的VFL布局

VFL: Visual Format Lanuguage

示例代码

//
//  main.m
//  hellococoa
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController
@end

@implementation MyViewController
- (void)loadView {
    [super loadView];
    self.view = [[UIView alloc] init];

    UIView *leftView = [[UIView alloc] init];
    UIView *rightView = [[UIView alloc] init];

    leftView.backgroundColor = [UIColor magentaColor];
    rightView.backgroundColor = [UIColor purpleColor];

    leftView.translatesAutoresizingMaskIntoConstraints = NO;
    rightView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:leftView];
    [self.view addSubview:rightView];

    NSDictionary *metrics = @{@"space": @10};
    NSDictionary *views = NSDictionaryOfVariableBindings(leftView, rightView);
    [self.view addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"H:|-space-[leftView]-[rightView(==leftView)]-space-|"
                                options:nil
                                metrics:metrics
                                  views:views]];
    [self.view addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"V:|-space-[leftView]-space-|"
                                options:nil
                                metrics:metrics
                                  views:views]];
    [self.view addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"V:|-space-[rightView]-space-|"
                                options:nil
                                metrics:metrics
                                  views:views]];
}

@end

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
@property(nonatomic) UIWindow *window;
@end

@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions {
    // 1. Create window
    self.window = [[UIWindow alloc] init];
    self.window.frame = UIScreen.mainScreen.bounds;
    self.window.backgroundColor = [UIColor grayColor];
    // 2. Bind window to ViewController
    self.window.rootViewController = [[MyViewController alloc] init];
    // 3. Show window
    [self.window makeKeyAndVisible];
    return YES;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"%@", NSStringFromClass([MyAppDelegate class]));
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

注意:

  • 约束一定要全,要能唯一确定子视图的位置和大小
  • 每一个子视图一定要在垂直方向和水平方向至少出现一次

3. 使用AutoLayout的封装库Masonry进行布局

Mansonry是对AutoLayout的封装,可以通过CocoaPods安装

示例代码

//
//  main.m
//  hellococoa
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <Masonry/View+MASAdditions.h>

@interface MyViewController : UIViewController
@end

@implementation MyViewController
- (void)loadView {
    [super loadView];
    self.view = [[UIView alloc] init];

    UIView *leftView = [[UIView alloc] init];
    UIView *rightView = [[UIView alloc] init];

    leftView.backgroundColor = [UIColor magentaColor];
    rightView.backgroundColor = [UIColor purpleColor];

    leftView.translatesAutoresizingMaskIntoConstraints = NO;
    rightView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:leftView];
    [self.view addSubview:rightView];

    // 左布局相对于父布局
    [leftView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view.mas_top).with.offset(10);
        make.left.equalTo(self.view.mas_left).with.offset(10);
        make.bottom.equalTo(self.view.mas_bottom).with.offset(-10);
    }];

    // 右布局相对于父布局
    [rightView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view.mas_top).with.offset(10);
        make.right.equalTo(self.view.mas_right).with.offset(-10);
        make.bottom.equalTo(self.view.mas_bottom).with.offset(-10);
    }];

    // 右布局相对于左布局
    [rightView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(leftView.mas_right).with.offset(10);
        make.width.equalTo(leftView.mas_width);
    }];
}

@end

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
@property(nonatomic) UIWindow *window;
@end

@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] init];
    self.window.frame = UIScreen.mainScreen.bounds;
    self.window.backgroundColor = [UIColor grayColor];
    self.window.rootViewController = [[MyViewController alloc] init];
    [self.window makeKeyAndVisible];
    return YES;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"%@", NSStringFromClass([MyAppDelegate class]));
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

4. Flex布局

iOS可以通过第三方库 YogaKit 实现Flex布局

示例代码

//
//  main.m
//  hellococoa
//
//  Created by bj on 2018-12-22.
//  Copyright © 2018 bj. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <YogaKit/UIView+Yoga.h>

@interface MyViewController : UIViewController
@end

@implementation MyViewController
- (void)viewDidLoad {
    UIView *root = self.view;
    root.backgroundColor = [UIColor redColor];

    root.yoga.isEnabled = YES;
    root.yoga.flexDirection = YGFlexDirectionRow;
    root.yoga.justifyContent = YGJustifyCenter;
    root.yoga.alignItems = YGAlignStretch;
    root.yoga.padding = YGPointValue(10);

    UIView *leftView = [UIView new];
    leftView.yoga.isEnabled = YES;
    leftView.yoga.flexGrow = 1.0;
    leftView.backgroundColor = [UIColor blueColor];

    UIView *rightView = [UIView new];
    rightView.yoga.isEnabled = YES;
    rightView.yoga.flexGrow = 1.0;
    rightView.yoga.marginLeft = YGPointValue(10);
    rightView.backgroundColor = [UIColor greenColor];

    [root addSubview:leftView];
    [root addSubview:rightView];
    [root.yoga applyLayoutPreservingOrigin:NO];
}
@end

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
@property(nonatomic) UIWindow *window;
@end

@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] init];
    self.window.frame = UIScreen.mainScreen.bounds;
    self.window.backgroundColor = [UIColor grayColor];
    self.window.rootViewController = [[MyViewController alloc] init];
    [self.window makeKeyAndVisible];
    return YES;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"%@", NSStringFromClass([MyAppDelegate class]));
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

注意

  • 需要调用 .yoga.isEnabled 启用Flex布局
  • 必须调用 -[YGLayout applyLayoutPreservingOrigin:] 并设为NO
  • YogaKit 是Swift库,必须动态链接,需要在Podfile种设置 use_frameworks!

CocoaPods的安装与使用

CocoaPods是Objective-C的依赖管理工具

安装CocoaPods

CocoaPods是用 Ruby 写的,需要通过 gem 安装

gem install cocoapods

注意:

  • 如果使用的是系统 gem ,需要使用 sudo install cocoapods
  • CocoaPods需要克隆整个依赖仓库,目前大约需要下载600MB的内容

使用CocoaPods

pod init
vim Podfile
pod install
open App.xcworkspace

示例Podfile

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'hellococoa' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for hellococoa
  pod 'AFNetworking', '~> 2.6'
  pod 'Masonry'

  target 'hellococoaTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'hellococoaUITests' do
    inherit! :search_paths
    # Pods for testing
  end
end

文章首发: https://baijifeilong.github.io


以上所述就是小编给大家介绍的《iOS大杂烩》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript忍者秘籍

JavaScript忍者秘籍

John Resig、Bear Bibeault / 徐涛 / 人民邮电出版社 / 2015-10 / 69.00

JavaScript语言非常重要,相关的技术图书也很多,但没有任何一本书对JavaScript语言的重要部分(函数、闭包和原型)进行深入、全面的介绍,也没有任何一本书讲述跨浏览器代码的编写。本书是jQuery库创始人编写的一本深入剖析JavaScript语言的书。 本书共分四个部分,从准入训练、见习训练、忍者训练和火影训练四个层次讲述了逐步成为JavaScript高手的全过程。全书从高级We......一起来看看 《JavaScript忍者秘籍》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具