记录20160421

不使用 main storyboard的项目

在创建项目时,默认是有 main storyboard 的,如不需,步骤:

  • 编辑 target,删除 General ,删除 Main Interface 里面的 "Main"。
  • 删除项目中的 Main.storyboard 和 ViewController.swift 文件
  • 重写 AppDelegate.swift 。
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        self.window = UIWindow()
        self.window!.rootViewController = UIViewController()
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyWindow()
    
        return true
    }
}

使用自定义的 UIWindow

  • 使用 main storyboard 的 App

    lazy var window: UIWindow? = {
      return MyWindow()
     }()
    
  • 不使用 main storyboard 的 App

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        self.window = MyWindow()
        self.window!.rootViewController = UIViewController()
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyWindow()
    
        return true
    }
}

获取 window 的方法

  • 根据 UIView 的属性直接获取

    let window = self.view.window
    

返回值可为空,但一般情况下不会空,每个 View 肯定会在 UIWindow 上存在,如果返回空,则这个 View 不可见。

  • AppDelegate 的实例属性获取

      let window = UIApplication.sharedApplication().delegate!.window!!
      //或者
      let window1 = (UIApplication.sharedApplication().delegate as AppDelegate).window!
    
  • 根据 keyWindow 属性

      let w = UIApplication.sharedApplication().keyWindow!
    

但是,这种方式的话,有时可能会收到影响。比如我们创建了一个临时的 UIWindow 时。

验证 UIView 的子类关系

使用isDescendantOfView方法来验证,是不是子类关系,不一定是直接子类。

    let vv = UIView()
    if vv.isDescendantOfView(self.view) {
        print("It is subview")
    }

移除所有的子类视图

let vv = UIView()
vv.subviews.forEach { (subView) in
    subView.removeFromSuperview()
}
//或
vv.subviews.forEach{
    $0.removeFromSuperview()
}

将子类视图显示在父类视图的 bounds 范围之外

设置视图的clipsToBounds属性。

透明度和可见性的设置

设置属性 hidden 来设置可见性,true 隐藏,false 为可见
设置属性alpha属性来设置透明度,1.0表示不透明,0.0标识透明。这个属性会影响背景色或者他上面内容的透明度也。
设置opaque。default is YES. opaque views must fill their entire bounds or the results are undefined. the active CGContext in drawRect: will not have been cleared and may have non-zeroed pixels。opaque属性提示绘制系统如何处理view。如果opaque设置为YES,绘图系统会将view看为完全不透明,这样绘图系统就可以优化一些绘制操作以提升性能。如果设置为NO,那么绘图系统结合其它内容来处理view。默认情况下,这个属性是YES。  如果屏幕是静止的,那么这个opaque属性的设置与否不是一个大问题。但是,如果view是嵌入到scroll view中的,或者是复杂动画的一部分,不将设置这个属性的话,肯定会影响程序的性能!可以通过模拟器的Debug\Color Blended Layers选项来查看哪些view没有设置为不透明。为了程序的性能,尽可能的将view设置为不透明!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 UIView或者它的子类知道怎样将自己绘制在一个矩形区域中。我们app所有可视的的界面来自于视图。创建和配置...
    smalldu阅读 920评论 0 6
  • 第一部分views 简介 A view is a unit of your app that knows how ...
    廖马儿阅读 526评论 0 1
  • View简介 一个view可以从nib生成,也可以在代码中创建。View hierarchy 是主要的view组织...
    Felix_Smile阅读 606评论 0 0
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 741评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,389评论 25 709