UI 滚动时卡住 UIPickerView、UITableView ios8、ios9
UI getting freezed while scrolling UIPickerView, UITableView ios8, ios9
我有一个视图,其中包含一个 pickerView 和一个 TextView。
当我展示我的视图时,滚动越来越卡住。
来到 4-5 次之后视图,它越来越卡住,最后 UI 在滚动 UIPickerView 时完全冻结。 PickerView 有 4 个组件,其中 3 个具有大约 50 个值。
请检查下面我的 PickerView 代码:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 4;
}
// The number of rows of data
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component
{
return [[_pickerData objectAtIndex:component] count];
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent: (NSInteger)component
{
switch (component){
case 0:
return 150.0;
case 1:
return 50.0f;
case 2:
return 20.0f;
case 3:
return 50.0f;
}
return 0;
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UILabel* tView = (UILabel*)view;
if (!tView){
tView = [[UILabel alloc] init];
tView.font=[UIFont fontWithName:@"ArialNarrow" size:22];
tView.textAlignment=NSTextAlignmentCenter;
tView.text=_pickerData[component][row];
// Setup label properties - frame, font, colors etc
}
return tView;
}
请帮助我。
如果您只想在pickerView
中显示text
,那么我建议您使用此方法。
- (NSAttributedString*) pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSAttributedString *str = [[NSAttributedString alloc] initWithString:_pickerData[component][row] attributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor whiteColor], NSForegroundColorAttributeName, [UIFont fontWithName:@"ArialNarrow" size: 22], NSFontAttributeName, nil]];
return str;
}
而不是使用
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
可能lable
分配了很多次。
希望对你有帮助。
感谢加里的帮助。
我已经解决了这个问题。问题出在线程上。我通过在应用程序冻结时暂停应用程序来发现问题。在左侧,我们可以看到 运行 线程。从那里我抓住了线程调用。它干扰了主线程,这就是应用程序冻结的原因。
我有一个视图,其中包含一个 pickerView 和一个 TextView。
当我展示我的视图时,滚动越来越卡住。
来到 4-5 次之后视图,它越来越卡住,最后 UI 在滚动 UIPickerView 时完全冻结。 PickerView 有 4 个组件,其中 3 个具有大约 50 个值。
请检查下面我的 PickerView 代码:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 4;
}
// The number of rows of data
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component
{
return [[_pickerData objectAtIndex:component] count];
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent: (NSInteger)component
{
switch (component){
case 0:
return 150.0;
case 1:
return 50.0f;
case 2:
return 20.0f;
case 3:
return 50.0f;
}
return 0;
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UILabel* tView = (UILabel*)view;
if (!tView){
tView = [[UILabel alloc] init];
tView.font=[UIFont fontWithName:@"ArialNarrow" size:22];
tView.textAlignment=NSTextAlignmentCenter;
tView.text=_pickerData[component][row];
// Setup label properties - frame, font, colors etc
}
return tView;
}
请帮助我。
如果您只想在pickerView
中显示text
,那么我建议您使用此方法。
- (NSAttributedString*) pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSAttributedString *str = [[NSAttributedString alloc] initWithString:_pickerData[component][row] attributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor whiteColor], NSForegroundColorAttributeName, [UIFont fontWithName:@"ArialNarrow" size: 22], NSFontAttributeName, nil]];
return str;
}
而不是使用
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
可能lable
分配了很多次。
希望对你有帮助。
感谢加里的帮助。
我已经解决了这个问题。问题出在线程上。我通过在应用程序冻结时暂停应用程序来发现问题。在左侧,我们可以看到 运行 线程。从那里我抓住了线程调用。它干扰了主线程,这就是应用程序冻结的原因。