1

我正在开发一个 iPad 应用程序,其中我有一个自定义子类,UIView其中包含一个UIWebView 显示 HTML 格式的文本(我将其命名为EssayView)。我UIView在每个页面上都有这些子类的一个实例UIScrollView。用户将其横向滚动以在不同文本之间进行选择,然后向下滚动以阅读文本。滚动视图有十个EssayViews

我的应用程序应该支持所有方向,但是当用户旋转设备(横向到纵向,反之亦然)时,会引发内存警告,并且应用程序通常会崩溃。

我做了一些分析。在运行 iOS 5 的 iPad 3 上,应用程序在显示 EssayScrollView 时消耗 528MB 的虚拟内存,但在运行 iOS 5 的 iPad 1 上它仅消耗 193MB ......它仍然在两者上崩溃。在运行 iOS 6 的 iPad 3 上,应用程序在显示 EssayScrollView 时消耗 640MB 的虚拟内存,但在旋转时不会崩溃。所以问题似乎出在运行 iOS 5 的设备上......

以下是我初始化 EssayView 实例的方法:

EssayView.m

@interface EssayView()
@property UIWebView *essayWebView;
@property NSString *essayName;
@property int essayNumber;
@end

@implementation EssayView

- (id)initWithEssayNamed:(NSString *)theEssayName number:(int)theEssayNumber{
    self = [super initWithFrame:CGRectMake(0,0,[[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height)];
    if(self){
        essayNumber = theEssayNumber;
        essayName = theEssayName;

        essayWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)];
        essayWebView.center = CGPointMake(self.bounds.size.width/2, essayWebView.center.y);
        [essayWebView setScalesPageToFit:NO];
        essayWebView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        essayWebView.delegate = self;
    }
    return self;
}

这是我在 EssayViews 父视图中的轮换代码:

EssayScrollView.m

- (BOOL)shouldAutorotate{
    return YES;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return YES;
}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [scrollView setContentSize:CGSizeMake([essayArray count] * scrollView.frame.size.width, scrollView.frame.size.height)];
    [scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width*currentEssay, 0) animated:NO];
}

我将一组分配给 in 的行UIViewAutoresizingMasks似乎UIWebView导致EssayView了问题。如果我将其注释掉,则 UI 旋转良好且平滑(当然 UIWebView 不会自动调整大小)。

在 iOS 5 上测试时,它会抛出内存警告,几秒钟后会旋转并经常崩溃。但是在 iOS 6 上它不会崩溃。在这两个操作系统上,旋转动画都比平时慢而且笨拙。

有没有办法让我的多个 webview 调整大小而不会导致内存警告和崩溃?

4

1 回答 1

2

那些记忆数字太高了。您基本上同时打开了 10 个浏览器选项卡并在最前面,并期望操作系统在旋转时重新渲染它们。您需要考虑重新使用 Web 视图,而不是同时使用 10 个。

据推测,用户一次只能查看一篇文章,因此无需同时加载所有文章。您可以缓存滚动位置或其他状态,并在加载视图时重新应用它。

于 2012-10-23T15:10:02.063 回答