为啥 UIScrollView 的滚动会在 iOS 4.3 中触发 layoutSubViews 方法,而在 5.0 及以上版本中却没有?

Posted

技术标签:

【中文标题】为啥 UIScrollView 的滚动会在 iOS 4.3 中触发 layoutSubViews 方法,而在 5.0 及以上版本中却没有?【英文标题】:Why UIScrollView's scrolling triggers layoutSubViews method in iOS 4.3 but not in 5.0 & above?为什么 UIScrollView 的滚动会在 iOS 4.3 中触发 layoutSubViews 方法,而在 5.0 及以上版本中却没有? 【发布时间】:2012-11-30 09:56:16 【问题描述】:

我已经自定义 UIView 来创建自定义 UI 组件。

视图的层次结构是这样的。

----自定义UIView

----------------UIScrollView

------------------ScrollView中的子视图

-(id)initWithFrame:(CGRect)frame

self = [super initWithFrame:frame];

if(self)

//Allocation and Initialization of ScrollView
//...
[super addSubView:scrollView];


return self;


- (void)layoutSubviews 

    DLog(@"%@",[NSThread callStackSymbols]);
    [super layoutSubviews];

    [self reloadData];



//This method can be used to reload the entire control
-(void)reloadData
//Reload the subviews of control

当滚动视图被滚动时,layoutSubviews 方法在 ios 4.3 版本中被调用。但在 4.3 (5.0 , 6.0) 以上版本的情况下,不会调用此事件处理程序。

在我的用例中,我不希望 layoutsubviews 被调用。

如何确保在滚动时有一个不会触发 layoutsubviews 方法的滚动视图?

【问题讨论】:

【参考方案1】:

我想出的解决方案如下:

    在自定义视图之上添加一个容器 UIView(供参考 ScrollViewHolder) 然后在视图ScrollViewHolder上添加UIScrollView。

----自定义UIView

----------------另一个 UIView

-------------------UIScrollView

--------------------------------------------子视图在滚动视图

init 方法现在改为如下:

-(id)initWithFrame:(CGRect)frame

self = [super initWithFrame:frame];

if(self)

//Allocation and Initialization of Container View

[super addSubView:ScrollViewHolder];
//Allocation and Initialization of ScrollView
//...
[ScrollViewHolder addSubView:scrollView];


return self;

【讨论】:

以上是关于为啥 UIScrollView 的滚动会在 iOS 4.3 中触发 layoutSubViews 方法,而在 5.0 及以上版本中却没有?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 iOS 7.0 中的 UIScrollView 中滚动?

IOS。当 UIScrollView 滚动时应用另一个滚动动画[关闭]

为啥即使我覆盖 touchesMoved:withEvent:,UIScrollView 的子类仍会滚动?

为啥滚动 UITableView 比滚动 UIScrollView 响应更快?

为啥 View Controller 在 UIScrollView 上方滚动?

为啥显示键盘时 UIScrollView 不滚动?