我正在开发一个 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 调整大小而不会导致内存警告和崩溃?