自定义 UIView 显示延迟
Posted
技术标签:
【中文标题】自定义 UIView 显示延迟【英文标题】:Custom UIView getting display late 【发布时间】:2015-04-24 10:28:13 【问题描述】:我遇到了一个奇怪的问题,我正在开发一个ios static library
,这个static library
有一些custom UIViews
。这些自定义视图包含用于这些按钮的UIButtons
和IBOutlets
,Custom UIView
已在Xib
中创建。现在我将这个静态库包含在另一个 static library
中,并且我正在附加 custom UIView
库一到静态库二的 UIViewController 的 UIView 与 -
[self.view addSubview:aCustomViewFromLibrary1];
因此,当我在某些产品中使用库 2 时,一切都很好,但是当将 static library one
的 custom UIView
添加到 static library two
的代码运行时,一切正常,但 custom UIView
出现晚了,大约晚了半分钟.
这是static library
中custom 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 显示延迟的主要内容,如果未能解决你的问题,请参考以下文章