自定义 UIView 显示延迟

Posted

技术标签:

【中文标题】自定义 UIView 显示延迟【英文标题】:Custom UIView getting display late 【发布时间】:2015-04-24 10:28:13 【问题描述】:

我遇到了一个奇怪的问题,我正在开发一个ios static library,这个static library 有一些custom UIViews。这些自定义视图包含用于这些按钮的UIButtonsIBOutletsCustom UIView 已在Xib 中创建。现在我将这个静态库包含在另一个 static library 中,并且我正在附加 custom UIView 库一到静态库二的 UIViewController 的 UIView 与 -

[self.view addSubview:aCustomViewFromLibrary1];

因此,当我在某些产品中使用库 2 时,一切都很好,但是当将 static library onecustom UIView 添加到 static library two 的代码运行时,一切正常,但 custom UIView 出现晚了,大约晚了半分钟.

这是static librarycustom UIView 之一的代码...

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if(!self)
        return nil;
    
    _otpTextField.delegate = self;
    loadView()
    _approveOtpBtn.layer.cornerRadius = 5;
    NSLog(@"%@",[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]);
    viewFrame = frame;
    CALayer *layer = self.layer;
    layer.shadowOffset = CGSizeMake(1, 1);
    layer.shadowColor = [[UIColor blackColor] CGColor];
    layer.shadowRadius = 4.0f;
    layer.shadowOpacity = 0.80f;
    layer.shadowPath = [[UIBezierPath bezierPathWithRect:layer.bounds] CGPath];
    return self;


-(id)initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:aDecoder];
    if(!self)
        return nil;
    

    loadView()
    _approveOtpBtn.layer.cornerRadius = 5;
    NSLog(@"%@",[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]);

    return self;




-(void) awakeFromNib

    NSLog(@"%@",[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]);
    _approveOtpBtn.layer.cornerRadius = 5;


// Approve OTP
-(IBAction)approveOtp:(UIButton *) aButton

    NSLog(@"%@",[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]);



// minimize custome browser
-(IBAction)minimizeCB:(UIButton *) aButton
    NSLog(@"%@",[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]);




- (void) RegenerateOTP:(UIButton *) aButton
    NSLog(@"%@",[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]);

------更新------ 这就是我在UIViewController's UIView 中添加custom View 以上的方式。

- (void) updateView
if([paymentOption isEqualToString:CHOOSE])
        if(_choose)
            [_choose removeFromSuperview];
            _choose = nil;
        
        if(_approveOTP)
            [_approveOTP removeFromSuperview];
            _approveOTP = nil;
        
        if(_regenOTPView)
            [_regenOTPView removeFromSuperview];
            _regenOTPView = nil;
        
        _choose =  [[CBAllPaymentOption alloc] initWithFrame:CGRectMake(0,self.resultView.frame.size.height - 227,self.resultView.frame.size.width,227)];
        _choose.bankJS = _bankSpecificjavascriptDict;
        _choose.handler = self;
        NSLog(@"loadJavascript AllOptionView view = %@ ResultView = %@",_choose,_resultView);
        //[_resultView addSubview:_choose];
        if(_connectionHandlerDelegate && [_connectionHandlerDelegate respondsToSelector:@selector(addViewInResultView:)])
            [_connectionHandlerDelegate addViewInResultView:_choose];
        
        [_resultView bringSubviewToFront:_choose];
        // view getting display late so call setNeedDisplay.
        [_choose setNeedsDisplay];
        _choose.isViewOnScreen = YES;
    

欢迎任何解决方案和建议

【问题讨论】:

这看起来不错,除了 addSubview 被注释掉了。当用户与此视图交互时,您是否获得了操作代码?您提到什么都没有出现,但是当您点击时,它会出现。把 setNeedsDisplay 作为最后一件事怎么样?尝试在我的答案中将该 updateView 方法包装在主线程块中。 实际上,您似乎正在删除 _choose(如果存在),然后对其进行初始化,但没有将其重新添加。 【参考方案1】:

您对 UI 所做的任何更改都必须在主线程上完成。

你可以试试这样的。

dispatch_async(dispatch_get_main_queue(), ^
  // perform updates here
);

【讨论】:

可能需要查看您使用此自定义视图的代码。 现在我可以显示自定义视图,但自定义视图中的按钮和文本字段没有显示。有什么建议吗? 我需要看更多。需要查看这些按钮以及创建它们的位置。它们可能被隐藏、框架错误、未初始化或只是未添加为子视图。 尝试记录这些按钮的框架。这样我们就可以知道它们是否不在视野范围内,或者甚至没有被创建。 按钮和其他控件总是在那里但没有显示,为什么我这么说是因为当我点击按钮/控件应该在的地方时,按钮被点击并且它也会出现.

以上是关于自定义 UIView 显示延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子视图的延迟/动态加载实现自定义 UIView,类似于 UITableView

显示键盘时,自定义 UIView 正在向上推部分内容

自定义 UIView 不显示

自定义 UIView 不显示任何内容

如何显示自定义模态 UIView?

当 UITableView 枯竭时需要帮助显示自定义 UIView