V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
refresh
V2EX  ›  iDev

经过一天的折腾,我还是放弃IB用代码构建UI了

  •  
  •   refresh · 2013-07-15 20:12:38 +08:00 · 7463 次点击
    这是一个创建于 4147 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这玩意儿实在不好调整,项目已经有一半的工作是用代码完成了,主要是对IB不熟悉,算了,还是放弃吧,代码就是工作量大点,但可控。

    哭泣中,用于布局的重复性代码太多了

    主要原因还是自己没有经过系统性的学习,捂脸...
    第 1 条附言  ·  2013-07-17 08:49:30 +08:00
    分享一下,这个项目很不错 https://github.com/andrewroycarter/UIView-Helpers
    54 条回复    1970-01-01 08:00:00 +08:00
    chchwy
        1
    chchwy  
       2013-07-15 22:58:00 +08:00
    何不具體說說你遭遇的困難點?
    alexrezit
        2
    alexrezit  
       2013-07-15 23:00:56 +08:00
    不熟悉 IB 的话会很麻烦的.
    tab
        3
    tab  
       2013-07-16 00:32:29 +08:00
    赶工的时候尽量少变动,可以把遇到的问题记下来,项目结束后带着问题学习。不过我一直认为,不会用IB的人很难写出规范的iOS UI,因为里头有些Apple的控件机制不好理解。个人理解的界面编程三层境界:纯代码->可视化编程->两者结合,融会贯通。IB确实很方便,如果你有个大显示器配合Storyboard那就更爽了。
    refresh
        4
    refresh  
    OP
       2013-07-16 10:28:20 +08:00
    @chchwy 现在问题卡在相对布局和自动大小上,估计坑还有很多,所以想等做完这个项目好好学习一下IB

    @alexrezit 是很麻烦,一直用代码,基本上没用过IB

    @tab 确实是这样的,不过多数人学习是从可视化开始的吧,两者结合是非常不错的选择,StoryBoard不适合组件化吧?我想把UI拆成一个一个组件,然后再把它们组装起来。
    damngood
        5
    damngood  
       2013-07-16 10:57:13 +08:00
    @tab @refresh 我觉得iOS下面的控件机制还比较好理解
    倒是Mac OS下面UI的包装没iOS那么好理解, 想完全nibless的话还得hack那么一下

    我写 iOS/Mac App 的时候也是一直用代码来写 UI 部分, 觉得那样比较纯粹一点, 看着心理舒服点
    总觉得能放在代码里面的干嘛要放在额外的一个文件里面呢
    如果你觉得这样导致代码比较多, 那也可以把 UI 块的代码写在一个方法里面然后给收缩起来

    这样对于SCM来说也友好点吧.
    当然关键还是心理舒服点 :)
    tab
        6
    tab  
       2013-07-16 11:13:21 +08:00
    @refresh 从可视化开始会让多数人一头雾水,很多人不用IB恐怕正是这个时候留下的阴影。
    你现在的问题是布局的代码较多,用了IB或者Storyboard直接就解决了。Storyboard就是组装用的,Apple自己的控件本身很完善了,如果不是较为复杂且经常重用的UI没必要组件化,消息传递啥的那样反倒麻烦,当然这个度得自己把握。
    nil
        7
    nil  
       2013-07-16 12:12:14 +08:00
    代码写布局很难么?一个控件的布局也就两三行搞定了啊。。。
    view.left = 10;
    view.top = 10;

    我是不是又土了。。。
    ytzong
        8
    ytzong  
       2013-07-16 13:12:32 +08:00
    IB 构建 UI 的飘过
    月经话题
    refresh
        9
    refresh  
    OP
       2013-07-16 14:09:44 +08:00
    @nil android? iOS下布局还是挺痛苦的

    @tab 把所有东西全弄到一起,维护的时候也挺痛苦的,并且不利于复用。

    @damngood 我基本就是你所说的做法,我在想,要是可以像写html一样写UI就好了,目前还没有见到比html/css更好的布局语言。
    damngood
        10
    damngood  
       2013-07-16 14:14:27 +08:00
    @refresh 我刚好反过来了.. 要是写 html css 那些 Web 组件也能像写 iOS 那样纯代码写那该多好呀.. :)
    nil
        11
    nil  
       2013-07-16 15:22:04 +08:00   ❤️ 1
    @implementation UIView (layout)

    - (CGFloat)left {
    return self.frame.origin.x;
    }

    - (void)setLeft:(CGFloat)x {
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
    }
    @end
    代码不全贴了,给UIView扩展一些帮助方法,直接写view.left = xxx; view.centerX = xx;总感觉比IB里面拖来拖去,各种设置各种找舒服多了吧; 复杂的view直接写到subclass的layoutsubview方法里面,简单的布局直接写到loadview里面;
    速度上应该不慢吧,灵活性上,代码重用上,能甩IB几条街了吧。。。
    refresh
        12
    refresh  
    OP
       2013-07-16 16:47:27 +08:00
    @nil 嗯,这样也不错,不过UIButton与UILabel这类怎么办,全部重写么?
    这个项目不错,用宏的方式添加了很多layout。 https://github.com/mvx24/CGRectPositioning
    sumanx
        13
    sumanx  
       2013-07-16 18:17:17 +08:00
    @refresh UIButton、UILabel这些不都是UIView么
    so898
        14
    so898  
       2013-07-16 19:01:37 +08:00
    公司项目,从SB到代码……别拦我……哭泣中……
    refresh
        15
    refresh  
    OP
       2013-07-16 19:14:25 +08:00
    @sumanx UIButton是UIView没错,但有办法给它们统一加上left, top这些属性吗,需要全部重载啊,或者有啥方法我不知道的
    PrideChung
        16
    PrideChung  
       2013-07-16 19:28:14 +08:00
    @refresh 显然是用Catagory啊。
    PrideChung
        17
    PrideChung  
       2013-07-16 19:29:14 +08:00
    @refresh 再加上objc_runtime。
    wtl
        18
    wtl  
       2013-07-16 19:50:58 +08:00
    静态的布局用@nil说的给UIView加个category

    动态的用autolayout 不过写起来挺长的 去找些第三方的库 可以少些点
    比如这样 [button alignCenterYWithView:superView]
    meepoli
        19
    meepoli  
       2013-07-16 20:26:43 +08:00
    我只能说,不会IB当你想有一个工作上的提升的时候,太吃亏了。

    IB和纯Coding是都需要掌握的。也没有哪种方式比哪种方式高级的说法。
    refresh
        20
    refresh  
    OP
       2013-07-16 21:13:18 +08:00 via iPad
    @wtl 求第三方库

    @meepoli 是啊,可现学来不及,ib可以省好多事
    wtl
        21
    wtl  
       2013-07-17 07:35:42 +08:00
    @refresh github搜搜 还有pod search autolayout 看谁的api顺眼 就用谁的吧
    refresh
        22
    refresh  
    OP
       2013-07-17 09:28:19 +08:00
    @wtl
    @PrideChung

    求教,UIView的Catagory怎样才让UIButton和UILabel也能用?我现在需要将UIButton转成UIView才能使用自定义的Category。
    如:
    ((UIView *)btn).left = 10;

    我希望是可以
    view.left = 10;
    也可以
    btn.left = 10;
    refresh
        23
    refresh  
    OP
       2013-07-17 09:33:22 +08:00
    好吧,我搞错了,抱歉,是可以的。
    offspring
        24
    offspring  
       2013-07-17 10:32:55 +08:00
    @refresh 基础很重要啊... 至少像UIButton这种基础的控件的继承关系要搞清楚啊
    wity_lv
        25
    wity_lv  
       2013-07-17 10:42:42 +08:00
    IB什么东西?
    从接触iOS开始,就一直用StoryBoard. 难道这个是SB ?
    囧...
    StoryBoard 拖结构, UIViewController设置成自己的自定义类型。
    StoryBoard 拖出来的UI需要复用,建多个StoryBoard. 多人开发的情况,一人一个StoryBoard.
    offspring
        26
    offspring  
       2013-07-17 11:13:49 +08:00
    @wity_lv storyboard也属于IB
    alexrezit
        27
    alexrezit  
       2013-07-17 12:34:09 +08:00
    @wity_lv
    你入行太晚了. 我刚开始玩儿的时候还是 iOS 3.x 呢, IB 是 Interface Builder 的缩写, 当时 Interface Builder 是单独的一个 app, 用来创建和修改 xib 文件的.
    wity_lv
        28
    wity_lv  
       2013-07-17 13:06:17 +08:00
    @alexrezit 原来如此.
    去年这个时候开始做ios dev. 那会已经是xcode 4。 storyboard用着顺手,就没研究xib.


    @offspring thx... SB这个叫法太2b了。
    railgun
        29
    railgun  
       2013-07-17 13:53:58 +08:00
    AutoLayout确实是个大坑,没有autosizemask直观。scrollview的autolayout搞死我了……
    除此之外IB还是很好用的。能省很多代码。
    代码和IB结合的话,确实会有一些麻烦,特别是如果父类view或者controller有控制view的代码的时候……
    refresh
        30
    refresh  
    OP
       2013-07-17 14:35:51 +08:00
    @railgun 使用Category简化之后,代码布局也还挺好
    PrideChung
        31
    PrideChung  
       2013-07-17 16:43:23 +08:00
    @railgun 电磁炮打蚊子肯定没电蚊拍好用。
    sumanx
        32
    sumanx  
       2013-07-18 11:18:37 +08:00
    @refresh 因为它们都是UIView,所以只要给UIView加上了这些属性,UIButton、UILabel就都自动有了。
    phpuser
        33
    phpuser  
       2013-07-19 00:48:29 +08:00
    我看有人用StoryBoard布局,然后几乎不用IBOutlet,而是用tag获取对象操作,有何优缺点呢?
    PrideChung
        34
    PrideChung  
       2013-07-19 00:55:54 +08:00
    @phpuser 不建议用tag,我也只试用过一次,马上重构掉了。很多人说storyboard是quick and dirty,我认为tag是比storyboard更加dirty的东西。
    alexrezit
        35
    alexrezit  
       2013-07-19 08:02:23 +08:00 via iPhone
    @phpuser
    永远不要用 tag.
    celon
        36
    celon  
       2013-07-19 10:24:46 +08:00
    隐约觉得有种段子的感觉:
    玩单片机的看不起用linux的
    用linux的看不起用windows的
    ……
    用代码构建的看不起用Storyboard的
    moyerock
        37
    moyerock  
       2013-07-19 10:30:51 +08:00
    硬编码layout..
    refresh
        38
    refresh  
    OP
       2013-07-19 10:46:11 +08:00
    @celon 用ib没什么不好的,只是,我真的不会,这是一个技能缺陷。
    @PrideChung 用tag会有问题,我有时候会用tag查找元素
    @sumanx 是,之前代码有点问题,所以不行
    mrschoba
        39
    mrschoba  
       2013-07-19 11:56:07 +08:00
    写 html/css 方式来写 UI,可以试试 Pixate,个人觉得用代码构建 UI 和用 Storyboard 没有孰优孰劣,按自己喜欢就可以。哪个自己写起来有效率就用哪个呗!
    refresh
        40
    refresh  
    OP
       2013-07-19 12:25:34 +08:00
    @mrschoba 并非讨论孰优孰劣,只是想学,还不会,项目又紧。
    ps. pixate看上去不错,收藏了,似乎要付费
    PrideChung
        41
    PrideChung  
       2013-07-19 18:07:08 +08:00
    项目紧的时候对陌生技术的引入要慎之又慎,血的教训。
    phpuser
        42
    phpuser  
       2013-07-19 22:13:46 +08:00
    @PrideChung
    @alexrezit

    我是看一个巨大无比的TableViewCell里面,很多UILabel,UIImageView直接用tag(不同分段100开头,200开头)让后用不同数组的往不同的tag段里面赋值。

    感觉还挺好啊,至少不用拉那么多的IBOutlet,不用一个的赋值。而且 iPad , iPhone 不同的界面不用再拉一次Outlet。

    这种场景也不合适么?

    那么Tag是干什么用的?其存在的意思是什么?

    谢谢。
    alexrezit
        43
    alexrezit  
       2013-07-20 09:24:29 +08:00
    @phpuser
    Tags 的作用就是标记 subview, 只不过是一种很丑陋的实现.
    damngood
        45
    damngood  
       2013-07-20 10:36:13 +08:00
    @alexrezit @pppuser
    链接的那篇文章主要是还是反对对于 tag 的滥用, 而不是完全反对使用

    只是说如果要使用的话 因该 1)不要滥用 2)尽量使用 macro 或者 enum 来让命名清晰

    至于 performance, 我觉得这个影响是微乎其微的, 毕竟一个parent view 不会有太多的 sub view, 就算如果有太多的 sub view, 那首先也应该是内存的瓶颈了..

    至于 ugliness, 我个人倒是觉得在 property list 里面加入很多 reference 还不如 tag 来得清爽 -- 纯主观个人看法 :)
    refresh
        46
    refresh  
    OP
       2013-07-20 11:10:15 +08:00
    @damngood 我认为tag是一个标识,用于识别subview的,作者的意思是,你不要用tag的保存数据,如果你要保存数据,应该使用属性而非tag。
    damngood
        47
    damngood  
       2013-07-20 11:12:16 +08:00
    @refresh 嗯, 用tag来保存非标识数据就是属于一种滥用
    alexrezit
        48
    alexrezit  
       2013-07-20 12:03:21 +08:00
    @damngood
    是的, 我见过某些国内的开发者用 tag 来记录属性. 我之所以说不要使用 tag 就是因为少有人知道怎么正确并灵活地使用.
    allenhsu
        49
    allenhsu  
       2013-07-26 15:12:49 +08:00
    在我的经验中,有时候 xib 的作用不是布局而是初始化 views,有时候我会在 xib 里初始化若干 views 用 IBOutlet 链接,此时他们没有父子关系和相对位置关系,仅仅是若干被初始化的独立组件,然后在 viewDidLoad 中来组装他们的父子关系和相对位置。
    railgun
        50
    railgun  
       2013-07-26 15:46:01 +08:00
    @alexrezit @damngood @refresh 同意,在view里存放数据很明显是不符合MVC规则的
    refresh
        51
    refresh  
    OP
       2013-07-29 23:16:55 +08:00
    @tab 组件嵌套,消息传递确实很麻烦,正感受到这种麻烦,求解
    tgfbeta
        52
    tgfbeta  
       2013-07-30 09:32:51 +08:00
    刚刚把项目的最核心的view和view controller给整到storyboard。
    最大的障碍是: UIView 不能 加subview!不知道水果负责IB的组在想啥……
    tokki
        53
    tokki  
       2013-07-30 10:20:17 +08:00
    看这个讨论这么激情 打算回头再取玩玩ios-,-
    tgfbeta
        54
    tgfbeta  
       2013-07-30 10:48:09 +08:00
    刚刚把项目的最核心的view和view controller给整到storyboard。
    最大的障碍是: UIImageView 不能 加subview!不知道水果负责IB的组在想啥……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5345 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:30 · PVG 09:30 · LAX 17:30 · JFK 20:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.