升级到iOS7/xcode 5后,UIScrollView无法滚动

19

我有一个应用程序,在xcode 4.5和iOS 6.1中滚动时完美运行。 然而,在下载了xcode 5和iOS 7之后,我的滚动视图不再起作用了。???

以下是我的.h文件:

#import <UIKit/UIKit.h>

@interface GrillretterViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIScrollView *grillretterScroller;
@property (assign) CGPoint rememberContentOffset;

@end

这是我的 .m 文件:

#import "GrillretterViewController.h"

@interface GrillretterViewController ()

@end

@implementation GrillretterViewController
@synthesize grillretterScroller, rememberContentOffset;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [grillretterScroller setScrollEnabled:YES];

    // Do any additional setup after loading the view.
}

- (void) viewDidAppear:(BOOL)animated {
    [grillretterScroller setContentSize:CGSizeMake(300, 915)];

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];
    self.grillretterScroller.contentOffset = CGPointMake(0, 0);
}

- (void)viewWillDisappear:(BOOL)animated {
    self.rememberContentOffset = self.grillretterScroller.contentOffset;
    [super viewWillDisappear:animated];
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.grillretterScroller.contentOffset = CGPointMake(0, self.rememberContentOffset.y);
}



- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

请帮忙!我卡住了!

最好的祝福!


我正在使用故事板,"checked your xib file" 是什么意思?在视图中,我已启用滚动 - 是的 :) - Tobias Lindgreen
要知道 ScrollView 是否已连接到 IBOutlet,可以这样做: - Camo
一切都已连接 - 在Xcode 5中打开项目后,我没有更改任何连接或代码。 - Tobias Lindgreen
在所有这些方法中,你应该使用super调用。另外,请确保启用用户交互。 - msgambel
我刚刚在最后一个方法中添加了超级调用,但是没有运气:( 我在哪里可以检查用户交互是否已启用? - Tobias Lindgreen
我找到问题所在了!我启用了自动布局,这导致滚动视图无法滚动。 禁用自动布局后,一切都恢复正常 :) - Tobias Lindgreen
9个回答

50

在滚动视图的主视图中,取消选择“使用自动布局”即可解决此问题。

输入图像描述输入图像描述

如果您想保持“自动布局”启用状态,请尝试“编辑器 -> 解决自动布局问题 -> 添加缺少的约束条件”。关键的约束条件似乎是“底部间距:超级视图”,在我的情况下是-300,为视图底部提供了300个滚动空间。


这对我也起作用了... 我非常确定你的答案应该被标记为“正确”。 - Mr.Hardy
12
在故事板中的每个视图控制器中放弃AutoLayout,你将失去所有其优势。我怀疑这对大多数人来说都不是一个选择。 - Phil
这个方法可行!然而,所有的视图控制器都被禁用了自动布局,这引起了一些不同的问题。但问题得到解决了。 :) 谢谢 - Tobias Lindgreen
9
这不是禁用自动布局功能的正确解决方案。 - Satyam
“解决自动布局问题” 差点就让我成功了。除此之外,我的滚动视图中的视图在设置垂直约束为-167后,编辑为0,然后才使滚动正常工作。 - Adam Knights
显示剩余3条评论

28

如用户user2394787所述:

选择包含滚动视图的视图控制器,然后转到

Editor -> Resolve AutoLayout Issues -> Add Missing Contraints in [your view controller].  

这样就可以使其正常工作。

我尝试投票支持上面的回答,但是没有足够的声望。


这就是答案!在IOS7 / XCODE5中有效-我再说一遍。要创建一个使用Storyboard不需要编码的工作滚动视图,请按照此线程上接受的答案给出的说明进行操作:https://dev59.com/2moy5IYBdhLWcg3wCpvQ 然后对编辑器进行->解决自动布局问题->添加缺少的约束即可。 - ChuckKelly

7
我刚刚通过进入“编辑器” > “解决AutoLayout问题” > “在视图控制器中添加缺失的约束条件”来解决了它。
希望这可以帮到你。

2
是的,这个完美地运作。移除自动布局不是人们应该做的事情。 - Charles

6
我刚刚将“垂直间距”设置为自动常数值。也许在某些情况下会有所帮助。
并在属性检查器中进行设置
请注意选择“标准”
我希望这会有所帮助。谢谢。

2

我不确定这是否会起作用。

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [grillretterScroller setContentSize:CGSizeMake(self.view.bounds.size.width, 915)];
}

TobiasLindgreen,请将答案更改为@Jim Holland发布的答案。 - Mr.Hardy

2
- (void)viewDidLayoutSubviews {
    [self performSelector:@selector(updateContentSize)
               withObject:nil
               afterDelay:0.25];

}

-(void)updateContentSize{
    UIView *viewLast = [viewContent viewWithTag:100];
    scrollViewAd.contentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, CGRectGetMaxY(viewLast.frame));
}

0

我没有固定的高度,所以我根据滚动视图内部的标签在代码中设置了滚动视图的内容大小。

CGSize scrollViewContentSize = CGSizeMake(320, myLabel.frame.size.height);
[self.scrollView setContentSize:scrollViewContentSize];

确保scrollView.contentSize不为0。 - Spidey

0
我在为iOS8开发应用程序后,在iOS7上进行测试后遇到了同样的问题。尽管我已经尝试在滚动视图上设置某些选项,例如:
[self.scrollView setScrollEnabled:YES];
[self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 700)];
[self.scrollView setContentOffset:CGPointZero];

我的解决方案是进入Storyboard文件,确保滚动视图中的所有视图都设置了约束条件。滚动视图的内容大小由滚动视图内每个子视图的约束条件计算得出。在我的情况下,我有一个UIView和UITableView。在为UIView(顶部、前导、尾随、高度)和UITableView(垂直间距到UIView、前导、尾随、底部)设置约束条件后,滚动视图计算出内容大小并开始运行。
虽然关闭自动布局确实有效,但并不是每个人的理想解决方案。只需在Storyboard中玩耍,并为滚动视图中的所有子视图设置约束条件,以便从滚动视图顶部到底部设置一条垂直线的约束条件即可。

0
启用AutoLayout后,请确保在UIScrollView和其子视图之间应用了垂直间距(@"V:|-[subview]-|")。如果您的scrollView是用于水平滚动,请应用水平间距(@"H:|-[subview]-|")。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接