gpt4 book ai didi

iOS:在调用 view.hidden = NO 之后,有没有办法确定 UIView 何时出现

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:40 25 4
gpt4 key购买 nike

我有一个 UIView,其中包含 8 到 10 个大图像(每个都加载到 UIImageView 中)作为 subview 。这些图像彼此相邻对齐,因此它们构成了一个真正的长水平图像。这个 View 被放入一个 UIScrollView 中,这样用户就可以沿着这个长的水平图像滚动。

加载所有这些图像(从网络)需要相当长的时间,所以我决定将加载代码放入 NSOperation 子类中。在操作的主要方法中,每个 ImageView 都被添加到容器 View 中。

在这个过程中 View 是隐藏的,取而代之的是一个小的旋转图像(很像 UIActivityIndi​​catorView)。这是一些代码:

CategoryViewController.m

- (id)initWithFrame:(CGRect)frame
{
self = [super init];
if(self)
{
// do some unrelated stuff
[...]

loadIndicator = [[UIImageView alloc] initWithImage:img];
[loadIndicator setFrame:CGRectMake((frame.size.width - width) / 2, (frame.size.height - height) / 2, width, height)];
[loadIndicator setHidden:YES];

// this is the view which will contain those large images
backgroundView = [[UIView alloc] init];
backgroundView.hidden = YES;

scrollView = [[UIScrollView alloc] initWithFrame:frame];
[scrollView setDelegate:(id<UIScrollViewDelegate>)self];
[scrollView addSubview:backgroundView];

[self.view setFrame:frame];
}
return self;
}

- (void)viewDidLoad
{
// do some unrelated stuff
[...]

[self.view addSubview:loadIndicator];
[self.view addSubview:scrollView];

// setup a custom activity indicator
loadIndicator.hidden = NO;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
loadIndicatorRotation = 0;
rotationTimer = [NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector:@selector(updateRotation:) userInfo: nil repeats: YES];
[UIView commitAnimations];

// setup the operation to load all background images
operationQueue = [[NSOperationQueue alloc] init];
LoadBackgroundImagesOperation* operation = [[LoadBackgroundImagesOperation alloc] initWithImages:bgImageNames View:backgroundView Frame:frame];

// register to recieve the finish notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onFinishedLoadingBgImages) name:@"BgImagesFinishedLoading" object:operation];

// Add the operation to the queue
[operationQueue addOperation:operation];
[operation release];
[super viewDidLoad];
}

LoadBackgroundImagesOperation.m的主要方法

- (void)main
{
int left = 0;
int width, height;

int i;
for(i = 0; i < imageNames.count; i++)
{
if([self isCancelled])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"BgImagesCancelled" object:self];
return;
}

// code to retrieve the url of current image
[...]

NSData* data = [[NSData alloc] initWithContentsOfURL:imgURL];
UIImage* image = [[UIImage alloc] initWithData:data];
[data release];

double scalingFactor = frame.size.height / image.size.height;
width = image.size.width * scalingFactor;
height = image.size.height * scalingFactor;

UIImageView* imgView = [[UIImageView alloc] initWithImage:image];
[image release];

[imgView setFrame:CGRectMake(left, 0, width, height)];
[background addSubview:imgView];
[imgView release];

left += width;
[background setFrame:CGRectMake(0, 0, left, height)];
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"BgImagesFinishedLoading" object:self];
}

操作完成后,我隐藏旋转图像并显示包含大图像的 View 。

(再次回到 CategoryViewController.m)

- (void) onFinishedLoadingBgImages
{
[scrollView setContentSize:backgroundView.frame.size];

backgroundView.hidden = NO;
loadIndicator.hidden = YES;

if(operationQueue != nil)
{
[operationQueue cancelAllOperations];
[operationQueue release];
operationQueue = nil;
}
[rotationTimer invalidate];
rotationTimer = nil;
}

问题是,在调用 backgroundView.hidden = NO

之后,模拟器需要大约 2 秒,而在真实设备上最多需要 5 秒,直到图像真正可见

在那段时间我会继续显示事件指示器,但我不知道如何检测 backgroundview 是否出现以再次隐藏该指示器。

我试图将 backgroundview 放在它自己的 UIViewController 中,并在调用 viewDidAppear 时通知我的父 View Controller ,但这不起作用。 (我读到在嵌套 View Controller 中我必须手动调用 viewDidAppear,但这不是一个选项,因为我不知道它什么时候出现在第一位)。

此外,我不能只做肮脏的把戏并更改 backgroundViewloadIndicator 的顺序来隐藏它,因为大多数图像都有一些透明度,因此用户仍会看到指示器。

所以我真的希望,你们中的任何人都可以就如何检测 backgroundview 何时实际可见提出建议。

谢谢,克里斯

哦,抱歉,如果某些代码与问题无关。只是想向您介绍一下我正在做的事情。

最佳答案

你可以做的是创建一个 UIViewController 子类,并让它成为这个 View 的所有者,在那个方法中,你可以尝试将你需要的代码放在 viewDidLoad 方法中,看看这是否更准确,但我认为真正的问题是您使用的 imageViews 正在花时间加载图像,而不是 UIView。因此,UIView 是可见的,但是 imageViews 还没有加载它们的图像,所以你看不到任何东西。

关于iOS:在调用 view.hidden = NO 之后,有没有办法确定 UIView 何时出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com