`
anlulu
  • 浏览: 43436 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

LayoutSubViews 学习(转载)

    博客分类:
  • ios
ios 
阅读更多

layoutSubviews何时调用的问题

今天学习了一下UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。
宗上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。
\

ipad横竖屏切换解决方案
2011年08月01日 星期一 10:09
由于ipad的横竖屏不同,所以好的应用,横竖屏的页面布局也不一样。那么就需要横竖屏的整体解决方案。先看一个横竖屏布局不一样的界面。

上面两张图是来自同一个界面的横竖版的截屏。可以看出,横竖版显示的内容相同,但是界面布局不同。要实现上述布局,主要是运用UIView中 layoutSubviews方法。当UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。

下面是实现上述界面的最简单的原型:

首先分析可以知道左面是图片,右面是一个图片加文字的视图。下面就实现一个左面视图右面是一个图加一段字的事例。
事例的截图如下:

其中右面的文字和绿色部分是用一个子视图封装的。
整个布局是我在主视图中添加了一个ContentView视图,在ContentView视图中添加了一个ArticleView视图。
其中ArticleView和ContentView的xib文件都打开了


在ContentView中重写layoutSubviews方法,然后根据stausbar的方向判断当前视图的横竖屏。具体代码:
-(void)layoutSubviews{ 
[super layoutSubviews]; 
UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation]; 
if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) { 
//翻转为竖屏时 
[self setVerticalFrame]; 
}else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) { 
//翻转为横屏时 
[self setHorizontalFrame]; 

}

-(void)setVerticalFrame 

NSLog(@"竖屏"); 
[titleLable setFrame:CGRectMake(283, 0, 239, 83)]; 
[leftView setFrame:CGRectMake(38, 102, 384, 272)]; 
[rightView setFrame:CGRectMake(450, 102, 282, 198)]; 
}

-(void)setHorizontalFrame 

NSLog(@"横屏"); 
[titleLable setFrame:CGRectMake(183, 0, 239, 83)]; 
[leftView setFrame:CGRectMake(168, 122, 384, 272)]; 
[rightView setFrame:CGRectMake(650, 122, 282, 198)]; 
}

在具体的横竖屏方法中,从新设置各个组件的坐标即可。

接下来在ContentView中添加ArticleView视图。
-(id)initWithCoder:(NSCoder *)aDecoder 

if ((self = [super initWithCoder:aDecoder])) {

NSArray *arrayContentView =[[NSBundle mainBundle] loadNibNamed:@"ArticleView" owner:self options:nil]; 
rightView=[arrayContentView objectAtIndex:0]; 
[self addSubview:rightView]; 

return self; 
}

由于我用的是xib,所以初始化方法为initWithCoder,在这个中添加新的视图。

同样在ArticleView中设置横竖屏相应空间的坐标即可。
-(void)layoutSubviews{ 
[super layoutSubviews]; 
UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation]; 
CGRect rect=self.frame; 
rect.size.width=282; 
rect.size.height=198; 
[self setFrame:rect]; 
if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) { 
//翻转为竖屏时 
[self setVerticalFrame]; 
}else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) { 
//翻转为横屏时 
[self setHorizontalFrame]; 

}

-(void)setVerticalFrame 

NSLog(@"竖屏"); 
[contentView setFrame:CGRectMake(12, 6, 250, 125)]; 
[textLable setFrame:CGRectMake(50, 139, 182, 39)]; 
}

-(void)setHorizontalFrame 

NSLog(@"横屏"); 
[contentView setFrame:CGRectMake(12, 6, 106, 158)]; 
[textLable setFrame:CGRectMake(135, 11, 147, 39)]; 
}

 

layoutSubviews何时调用的问题

layoutSubviews何时调用的问题,这个方法是当你需要在调整subview的大小的时候需要重写(我这个翻译不严谨,以下是原文:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.),但有时候经常指望它被调用的时候没被调用,不希望它被调用的时候被调用了,搞的很上火。根据国外社区一个人帖子,做了总结性翻译。

layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

分享到:
评论

相关推荐

    iOS学习入门教程附有Demo

    2. 加载视图:视图的加载可能在需要显示时才发生,通过layoutSubviews方法调整子视图的布局。 3. 显示与隐藏:通过hidden属性控制视图的可见性,而addSubview:和removeFromSuperview方法则控制视图的添加与移除。 ...

    IOS应用源码Demo-自动旋转-毕设学习.zip

    - 对于某些特定的界面元素,可能需要重写`layoutSubviews`方法来手动调整位置和大小。 - 使用`willTransition(to:with:)`方法可以监听到即将发生的方向改变,从而在变化发生前进行必要的准备。 3. 源码分析: - ...

    IOS应用源码Demo-可扩展的输入框-毕设学习.zip

    1. 自定义视图:为了实现可扩展性,开发者可能自定义了一个继承自UITextField的子类,并重写了其布局相关的方法,如`layoutSubviews()`,以在文本内容改变时更新输入框的高度。 2. 观察者模式:可能使用KVO(Key-...

    IOS应用源码Demo-仿UIAlertView和UIActionSheet的一个效果-毕设学习.zip

    这涉及到理解视图的生命周期,如init方法、layoutSubviews方法等。 2. 视图层次管理:了解如何在视图控制器中添加、移除子视图,以及调整它们的层级关系。 3. 响应式编程:通过实现UIControl的 addTarget:action:...

    IOS应用源码Demo-一个点击图标,以3D动画的形式跳出的view demo-毕设学习.zip

    开发者可能通过重写`layoutSubviews()`方法来调整视图的位置和大小,同时利用Core Animation框架来实现3D动画。 Core Animation是iOS中处理图形和动画的主要技术。通过CALayer对象,开发者可以创建和管理视觉层,并...

    ipad横竖屏切换解决方案

    当 UIView 设置为自动适配屏幕时,当用户旋转设备的时候,会调用 layoutSubviews 方法,我们只需重写这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。 下面是一个简单的示例代码: ```objectivec -...

    IOS应用源码——上下有渐变效果的textView.rar

    在本文中,我们将深入探讨实现这一效果的技术细节,并学习如何在自己的iOS应用中复用或改进这一功能。 首先,我们需要理解渐变(Gradient)的概念。渐变是一种颜色过渡效果,通常由两种或多种颜色平滑地混合在一起...

    ios-Runtime的理解和简单运用.zip

    在这个例子中,`layoutSubviews` 方法的原有实现被替换成 `swizzled_layoutSubviews`,并在调用原方法之前添加了日志输出。 总之,iOS Runtime 是Objective-C和Swift强大而灵活的特性,它提供了深入理解和控制程序...

    iOS学习——ScrollView图片轮播和同类控件优先级问题-代码

    我们将主要基于博客文章《iOS学习——ScrollView图片轮播和同类控件优先级问题》中的代码进行讲解。 首先,我们来理解ScrollView图片轮播的基本原理。在iOS中,我们可以使用UIPageControl配合ScrollView来创建一个...

    iOS开发实现简单的圆形进度条显示效果

    通过查看源代码,我们可以学习到更多关于如何集成和自定义这个圆形进度条的知识。 总的来说,实现一个简单的圆形进度条在iOS开发中涉及到了Core Animation、自定义视图以及动画原理。通过这样的实践,开发者可以更...

    ios-自定义高德地图.zip

    为了自定义气泡,我们需要创建一个新的`MAAnnotationView`子类,覆盖其`- (void)layoutSubviews`方法,以绘制我们自己的视图。 ```swift import AMapFoundationKit import AMapLocationKit import AMapMapKit ...

    ios-UIView设置局部阴影,左右上下,左右底部阴影.zip

    通过查看源代码,我们可以学习如何根据视图的边界和内容动态调整阴影的形状和位置。 总的来说,实现UIView的局部阴影效果涉及到对Core Graphics和CALayer的理解。这包括使用`shadowPath`来提高性能,以及通过调整`...

    自定义按钮

    通过查看和学习这个项目,开发者可以更深入地理解自定义按钮的实现过程,并将其应用于自己的应用中。 总的来说,自定义按钮是iOS开发中的一个重要技巧,它可以极大地增强应用的视觉吸引力和交互体验。通过继承...

    横向tableView

    你可以使用AutoLayout来实现这一点,或者在cell的`layoutSubviews`方法中手动设置子视图的约束。 ```swift class HorizontalTableViewCell: UITableViewCell { override func layoutSubviews() { super....

    ios 弹出包含编辑框的对话框view

    如果需要编辑框高度可控且超出自动滚动,我们可以自定义一个`UITextField`子类,重写`layoutSubviews`方法来处理滚动逻辑: ```swift let textField = alertController.addTextField() textField.borderStyle = ....

    ios-自定义TabBar(OC、Swift).zip

    如果你需要更复杂的自定义,比如添加额外的UI元素或动画效果,可以创建一个自定义的`UITabBarController`子类,并重写`layoutSubviews`方法来绘制自定义的TabBar。 1. Objective-C: ```objc - (void)...

    给tableview分组添加阴影效果

    - 创建自定义的UIView子类作为section header,并在其中重写`layoutSubviews`方法,在这里设置阴影效果。 - 在`layoutSubviews`中设置layer的阴影属性,例如: ```swift override func layoutSubviews() { ...

Global site tag (gtag.js) - Google Analytics