can*_*boy 57 objective-c uiscrollview ios
我把一个UIScrollView放在我的笔尖中view,并将它与一个IBOutlet属性相关联.
现在,当我在我的viewDidLoad方法中执行此操作时,它似乎对以下内容没有影响contentSize:
self.sv.backgroundColor = [UIColor yellowColor]; // this works
CGSize size = CGSizeMake(1000.0, 1000.0);
[self.sv setContentSize:size]; // this does not
Run Code Online (Sandbox Code Playgroud)
它表现得好像contentSize与框架相同.这是怎么回事?当我关闭AutoLayout时,这开始工作.为什么?
yuf*_*yuf 83
我有同样的问题.自动布局UIScrollView搞砸了.
解决办法:将所有内容UIScrollView放入另一个中UIView,并将其UIView作为唯一的孩子UIScrollView.然后您可以使用自动布局.
如果接近末尾的事情搞砸了(UIScrollView滚动的方向结束),请更改末尾的约束以使其具有最低优先级.
HDd*_*per 68
我试过viewWillLayoutSubviews来更新scrollView的contentSize,它对我有用.
- (void)viewDidLayoutSubviews
{
[self.bgScrollView setContentSize:CGSizeMake(320, self.view.frame.size.height* 1.5)];
}
Run Code Online (Sandbox Code Playgroud)
-(void)viewDidLayoutSubviews
Run Code Online (Sandbox Code Playgroud)
被调用以通知视图控制器其视图刚刚布置了其子视图.
讨论
当视图控制器视图的边界发生更改时,视图会调整其子视图的位置,然后系统会调用此方法.但是,调用此方法并不表示已调整视图子视图的各个布局.每个子视图负责调整自己的布局.
在视图布局其子视图后,视图控制器可以覆盖此方法以进行更改.此方法的默认实现不执行任何操作.
Jla*_*lam 21
最简单/最干净的方法是在viewDidAppear中设置contentSize,这样就可以消除autolayout的影响.这不涉及添加随机视图.但是,依靠加载顺序实现工作可能不是最好的主意.
mat*_*att 14
这里有两个问题.(1)viewDidLoad太快了; 你必须等到布局完成之后.(2)如果你想使用带有来自笔尖的滚动视图的autolayout,那么你必须使用约束来完全描述它的大小contentSize(然后你根本不设置contentSizein代码),或者,如果你想要在代码中设置它,你必须阻止对scrollview的子视图的约束来指示contentSize.听起来你想做后者.为此,您需要一个UIView作为scrollview的唯一顶级子视图,并且在代码中您必须将其设置为不使用autolayout,启用它autoresizingMask并删除其他外部约束.我在这里展示了如何做到这一点的示例:
但也注意到下面的例子,它展示了如何完全使用约束,而不是的contentSize.
bra*_*ipt 14
第1步:创建一个UIScrollView
第2步:创建一个UIView滚动视图的子项,如下所示:
-UIScrollView
---UIView
-----Your other content
Run Code Online (Sandbox Code Playgroud)
(我们称之为contentView).
步骤3:在尺寸检查器中,为此视图提供高度和宽度(例如,320x700).

第4步(使用自动版式):创建一个从您的明确限制contentView,以它的父(中UIScrollView):连接4个边缘(顶部,前置,底部),然后给它一个定义的宽度和高度,你希望它太滚动.
例如:如果滚动视图跨越整个屏幕,则可以为内容视图指定[设备宽度]宽度和高度600; 然后它将设置UIScrollView匹配的内容大小.
要么:
步骤4(不使用AutoLayout):使用IB将这两个新控件连接到视图控制器(按住Ctrl键并从每个控件拖动到视图控制器的.h @implementation).假设每个被调用scrollView和contentView分别.它应该如下所示:
@interface YourViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UIView *contentView;
@end
Run Code Online (Sandbox Code Playgroud)
步骤5(不使用AutoLayout):在视图控制器的.h文件中添加(实际上,覆盖)以下方法:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.scrollView.contentSize = self.contentView.frame.size;
}
Run Code Online (Sandbox Code Playgroud)
Kar*_*yan 13
使用此代码.ScrollView setContentSize应该在主线程中调用async.
迅速:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
DispatchQueue.main.async {
var contentRect = CGRect.zero
for view in self.scrollView.subviews {
contentRect = contentRect.union(view.frame)
}
self.scrollView.contentSize = contentRect.size
}
}
Run Code Online (Sandbox Code Playgroud)
目标C:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
dispatch_async(dispatch_get_main_queue(), ^ {
CGRect contentRect = CGRectZero;
for(UIView *view in scrollView.subviews)
contentRect = CGRectUnion(contentRect,view.frame);
scrollView.contentSize = contentRect.size;
});
}
Run Code Online (Sandbox Code Playgroud)
您可以将这行代码用于*.m文件中
- (void)viewDidLoad{
[scroll setContentSize:CGSizeMake(320, 800)] ;
[scroll setScrollEnabled:TRUE];
[scroll setShowsVerticalScrollIndicator:NO];
[scroll setShowsHorizontalScrollIndicator:YES];
}
Run Code Online (Sandbox Code Playgroud)
为此,您需要以这种方式将UIScrollView的IBOutlet属性转换为*.h文件:
IBOutlet UIScrollView *scroll;
Run Code Online (Sandbox Code Playgroud)
并从Storyboard连接它.
要么,
您可以将此方法用于*.m文件:
-(void)viewDidLayoutSubviews
{
[scroll setContentSize:CGSizeMake(320, self.view.frame.size.height* 1.5)];
// this will pick height automatically from device's height and multiply it with 1.5
}
Run Code Online (Sandbox Code Playgroud)
这两个解决方案适用于xcode-5,xcode-6,xcode-6.1,xcode-6.2
| 归档时间: |
|
| 查看次数: |
91296 次 |
| 最近记录: |