• 2019-02-16

    苹果Cocoa框架中关于NSView和NSViewController的关系

    Views: 164 | No Comments

    开始接触苹果的 GUI 框架时,经常对 NSView/UIView 和NSViewControoler/UIViewController 的关系感到疑惑,因为包括 Windows 界面开发在内的很多GUI框架,都只有 View,而没有 ViewController 的概念。而且在很长一段时间的实际使用中,也经常感到 ViewController 是多余,特别是开发自定义 View,逻辑代码者写在 View 类中更方便。

    虽说 View 和 ViewController 是 MVC中 的概念,但我想从内存管理的角度来说说为什么 ViewController 必须存在。假设在这样的场景,这一个用户界面,上面随机地生成不定数量的框,然后把我们的 subview 添加到其中一个框里面。因为这些框是随机生成的,所以某一个代码框的对象可能在生成之后又被销毁了。如果这个框对象(也即 subview 的父节点)在被销毁时,也把 subview 销毁,那就不符合预期了。同时,也不能在销毁框之前把 subview 从框中移除,因为从代码逻辑上这样的实现并不优雅,而且违反很多代码的逻辑。

    所以,subview 的内存应该次给父节点之外的其它对象管理,自然而然地想到给 subview 创建一个 ViewController,逻辑上表示 View 属于 ViewController,由后者管理其内存,这样逻辑上比较通。不然只能交给业务代码管理,这样逻辑上不太合理。

    同时,允许存在不属于任何一个 ViewController 的独立的 View,实践上需要这种规则,例如我们动态地给某个父节点添加子节点,并且希望在销毁父节点时自动销毁子节点,因为这样代码更简洁。

    所以,有两个动机:

    1. 希望有些情况下销毁父节点时,不自动销毁子节点。
    2. 希望有些情况下销毁父节点时,自动销毁子节点。

    解决方案是 ViewController 和引用计数。

    这是 GUI 框架设计的一种思路。

    Posted by ideawu at 2019-02-16 22:32:55
  • 2018-02-07

    NSView NSImage NSData转换

    Views: 18719 | No Comments
    NSBitmapImageRep *bitmap =  [view bitmapImageRepForCachingDisplayInRect:[view visibleRect]];
    [view cacheDisplayInRect:[view visibleRect] toBitmapImageRep:bitmap];
    
    NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(width, height)];
    [image addRepresentation:bitmap];
    
    NSBitmapImageRep *bitmap = [NSBitmapImageRep imageRepWithData:data];
    
    NSBitmapImageRep *bitmap = [[[NSBitmapImageRep alloc] initWithCGImage:CGImage];
    
    Posted by ideawu at 2018-02-07 16:10:47
  • 2016-07-18

    CocoaUI 框架开发 iOS 应用的一般步骤

    Views: 14377 | No Comments

    CocoaUI 是一个非常强大方便的 UI 框架, 使用它, 可以极大的简化 iOS 界面开发, 你既不需要学习一套新的语法和语言, 也不需要使用繁琐的约束布局, 它用的就是 Web 开发中最常见的 HTML + CSS 流式布局方式, 但生成的是 iOS 原生的界面.

    有用户这样评价:

    @MrLiHong:
    这个框架真心方便,之前大部分时间都花在调整UI布局上了,整个过程枯燥无聊! 现在用这个框架后,效率提升太多,有更多的时间去写业务逻辑! 非常感谢!!!

    使用 CocoaUI 框架, 如果你遵循我推荐的步骤和方法, 可以让你的工作更快捷.

    1. 首先, 你需要阅读 http://www.cocoaui.com/ 上面的文档, 一定十几个网页, 请务必要仔细阅读.

    2. 接着, 下载 CocoaUI 框架的源码, 用 XCode 打开.

    3. 用 CocoaUI Viewer 界面调试器来调试 UI. 在这一步, 你就是将美工设计的界面图直接转换成 app 界面, 所见即所得, 非常方便.

    4. 最后, 在代码里加载 XML, 绑定事件. 一旦你用界面调试器调试完 UI 后, 就把 xml 文件移到你的 XCode 项目里, 然后用文档中提到的方法加载 UI. 加载后, 通过类似 getElementById() 一样的方法, 将 Objective-C 代码绑定到按钮或者输入框上面, 处理业务逻辑.

    Posted by ideawu at 2016-07-18 11:45:39 Tags:
  • 2016-05-10

    一个 GUI 系统的组成部分

    Views: 16894 | No Comments

    在做 iOS 上的 XML+CSS UI 布局框架 CocoaUI 的过程中, 我体会到了 Apple 技术的强大之处, Apple 的底层框架和库提供了强大的功能和友好的 API, 我在开发 GUI 框架(上层 UI 框架)时用到的许多技术功能点都是信手拈来.

    现在总结, 有不少想法, 记下来分享一下.

    首先, iOS 系统为什么那么"好"? 不仅开发者觉得好, 最终用户用起来也觉得棒! 对比看 Android 的软件界面, 毛毛糙糙, 生硬, 总是缺了很多神韵. 这当然有屏幕硬件的功能, 但软件技术的作用更多, 因为从公开的资料上看, 不少 Android 厂商使用了和苹果同类的硬件.

    Continue reading »

    Posted by ideawu at 2016-05-10 16:31:03
  • 2016-03-08

    Xcode 如何让 Objective C 项目链接 C++ 静态库

    Views: 12805 | 1 Comment

    如果你的 OC 项目引入了一个 C++ 静态库, 那么编译时会提示找不到 vtable 之类的的错误, 因为 OC 是 C 语言, 无法识别 C++ 的静态库, 解决方法是让 Xcode 认为你在使用 C++/Objective-C++, 假装也行.

    所以解决方法是:

    • 往项目里添加一个.cpp文件, 文件是空的.
    • 将 main.m 改名为 main.mm
    Posted by ideawu at 2016-03-08 18:50:50
  • 2015-12-08

    基于 CocoaUI 的 iOS 应用 UI 热更新技术

    Views: 9341 | No Comments

    传统的 iOS 应用由于苹果自身的技术所限, 无法实现丰富的 UI 换皮肤(主题)功能, 更不用说 UI 热更新. 如果要实现换皮肤功能, 只能在开发阶段, 提前考虑和设计好几套 UI(xib), 然后在 app 运行时进行切换. 对于想在节日或者某些特殊节点临时给界面加一些点缀, 苹果自身的技术就无法实现了, 只能由开发者自己开动脑筋. 但无论如何, 都需要开发者"提前"想好所有的可能性! 这基本不现实.

    而基于 CocoaUI 框架的 iOS 应用, 由于使用 XML+CSS 语言来定义界面, 所以只要程序员在代码中发起一个简单的 HTTP 请求, 就能从服务器端获取一套新的 UI, 从而实现 UI 热更新. 当然, 这要求在业务逻辑功能不变的前提下, 因为 CocoaUI 框架只解决 UI 相关的问题, 而业务逻辑仍然使用 Objective-C/Swift 语言来编写.

    对于使用 CocoaUI 框架的应用来说, 要实现换皮肤(UI 热更新), 思路是这样的:

    1. 开发阶段, 将一套完整的 XML+CSS 以及图片文件引入项目中, 打包时将包含这些 UI 资源文件, 所以应用在启动和使用过程中, 性能不会有任何影响.

    2. 程序中实现文件更新功能, 在运行阶段从服务器端下载新的一套或者几套 XML+CSS+图片 UI 资源文件, 可以采用一些成熟的现有技术, 如断点续传, patch 更新等.

    3. 一旦一套完整的 UI 资源文件下载完毕, 就可以根据服务器端的指令, 在某个时间, 或者根据某个条件触发, 切换到新的界面上来.

    当然, 你可以用你自己喜欢的加密技术, 用来保护你的 UI 资源, 对于 CocoaUI 来说, 它关心的只是 XML+CSS, 而不一定是文件.

    CocoaUI 是一个开源的强大的 iOS 原生 UI 框架, 并不是一个使用 WebView 的混合型浏览器框架. 官方网站是: http://www.cocoaui.com/

    Posted by ideawu at 2015-12-08 13:01:56 Tags:
|<<<123>>>| 1/3 Pages, 16 Results.