IOS UI编程细节

1. 判断一个subView是否可见的方法。 

viewWillAppear 和 viewWillDisAppear 并不像字面意思所表述的一样,不能用来判断一个View是否可见。

viewWillAppear: addSubView时被调用

viewWillDisAppear: removeFromSuperView时被调用

添加另外一个subview(覆盖住原先的subview)时不会触发原来的view的viewWillDisAppear方法,虽然它对用户来说已经是不可见了。

判断一个view是否可见可以使用下面的方法:

- (BOOL)isVisible
{ 
    //Note: The last object of the subviews array is the most front one. 
    if ([self.view.window.subviews lastObject] == self.view) 
    {
        return YES;
    }
    else 
    {
        return NO;
    }
}

2. 为什么要写self = [super init]?

[super init]的返回值有三种可能:

1. 初始化继承的实例变量,返回self,即self = self

2. 返回nil,表明初始化失败

3. 返回一个不同的对象,这种情况比较少见,只在基类是单例,或Class Cluster等情况下发生。


3. Iphone 5 上调用[UIScreen mainScreen]获取屏幕尺寸

在xcode4.5上,连接Iphone 5并调用[[UIScreen mainScreen] bounds]返回的依旧是老的(320,480)分辨率,你需要在程序的bundle中加入一张Default-568h.png的图片,才能使程序运行在iphone5的沙盒中。一个方便的方法是修改launch image。


4. [UIView layoutSubviews]什么时候会被调用?

  • init时不会被调用
  • addSubview时被添加的view及其所有subview都会被调用
  • setFrame时如果新的frame和老的frame不同时会被调用
  • 滑动一个UIScrollView会触发这个view及其父view调用layoutSubviews
  • 旋转或view尺寸改变会触发其父view被调用
5. 如何实现SubView中某些view旋转 某些view不旋转?

以addSubView方法添加到superView上的subView是不会接收到AutoRotate事件的(即subView的viewController中shouldAutoRotate,willRotateToInterface等方法不会被系统调用到),那么如何实现指定subView旋转呢,你需要在superView中重载shouldAutoRotate方法,然后在方法实现中调用并返回此时处于view hierarchy中最顶层的viewController的shouldAutoRotate方法。
伪代码:
  1. -(BOOL)shouldAutorotate  
  2. {  
  3.     return [self.topViewController shouldAutorotate];  
  4. }  

6. [UIWindow setRootViewController] 设置rootViewController后屏幕顶端出现白条的问题

解决办法: 在设置后重设view的frame为  [[UIScreen mainScreen ] applicationFrame ]
原因:http://stackoverflow.com/questions/2247647/offset-on-uiwindow-addsubview

7.  iphone5上view.frame获取不正确的问题

原因:在viewWillAppear被调用之前获取到的view的size是从nib文件中拿到的,比如你在iphone5上获取到一个全屏的view的高度可能是460(4s上的高度)。
解决:如果你有需求需要在viewWillAppear之前获取size,你可以通过[[UIScreen mainScreen] applicationFrame]来获取。

8. setBackgroundImage:Forstate 和 setImage:Forstate:的区别

比较弱智的问题,不过一开始在IB里面看到了设置image和background image两栏确实没搞明白什么区别,其实很简单,setImage会挡住button的title,setBackgroundImage不会。

9. BOOL是一个带符号字符型
它的值可以是-128到127之间任意一个值,而objc中YES值为1,NO值为2,所以如果你比较一个BOOL值和YES:(BOOL)100 == YES,返回值将是NO。

10. 递归遍历UIView的子View并输出树状图
(lldb) po [UIView recursiveDescription]

11. UIView 阻止某些subview接收touch events

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event


12. UILabel 换行

label.lineBreakMode =UILineBreakModeWordWrap;

label.numberOfLines = 0; //默认为1 设为0取消行数限制


13. UITableView 隐藏某一个section

numberOfRowsInSection

隐藏一个tableView中的某一个section需要修改三个回调: 

numberOfRowsInSection  

heightForHeaderInSection

heightForFooterInSection

在这三个回调中对于该section均返回0值,但是,值得注意的是,heightForHeaderInSection和heightForFooterInSection这两个回调会忽略返回的零值的情况,所以,我们还需要通过tableView的两个属性sectionHeaderHeight和sectionFooterHeight来将section的头尾高度设为0。



你可能感兴趣的:(IOS UI编程细节)