我对UIScrollView有一个非常大的问题。为了确保它不是我的实际项目,我为iOS 6和7创建了一个新项目,仅限iPhone。我禁用了autolayout。
这是我的代码(ViewDidLoad):
self.scrollView.delegate = self;
[self.scrollView setScrollEnabled:YES];
[self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)];
NSLog(@"contentSize width %f", self.scrollView.contentSize.width);
NSLog(@"contentSize height %f", self.scrollView.contentSize.height);
NSLog(@"%@", NSStringFromCGAffineTransform(self.scrollView.transform));
它返回“contentSize width 20000.000000”,“contentSize height 0.000000”和“[1,0,0,1,0,0]”。它向左或向右滚动,向上滚动
请帮忙!
在我意识到我没有设置UIScrollView委托之前,我遇到了同样的问题。此外,如果您使用自动布局,则需要等待将布局应用于UIScrollView。这意味着您应该在“viewDidLayoutSubviews”中设置内容大小。
在viewDidLoad方法中,框架可能不正确,将代码移动到此方法:
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Your code
}
使用此代码。 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
}
}
目标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;
});
}
好的,您的代码绝对没有问题。所以有些建议:
@interface yourViewController : UIViewController <UIScrollViewDelegate> {
}
- (void)viewWillAppear:(BOOL)animated {
self.scrollView.delegate = self;
[self.scrollView setScrollEnabled:YES];
[self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)];
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var contentRect = CGRect.zero
for view: UIView in scrollView.subviews {
if !view.isHidden {
contentRect = contentRect.union(view.frame)
}
}
scrollView.contentSize = contentRect.size
scrollView.contentSize.width = self.view.frame.width
}
使用Swift 3.X代码。转换@Karen Hovhannisyan的回答。