2016-10-21 2 views
0

У меня проблема с моим приложением. У меня есть вид с 25 кнопками с измененным cornerRadius. Так как iOS 10 занимает около 5-6 секунд, пока этот просмотр не загружается. Вот соответствующий код:cornerRadius вызывает длительное время загрузки в iOS 10

- (void)setupTiles { 
for (TileButton *btn in tiles_btn) { 
    btn.alpha = 0.0; 
    btn.layer.borderColor = [UIColor blackColor].CGColor; 
    btn.layer.borderWidth = 1.0f; 
    [btn layoutIfNeeded]; 
    bin.layer.cornerRadius = btn.frame.size.width*0.3; 
} 
[self colorTilesWithArray:currentTileColors]; 
} 

Когда я удалить следующие строки, это загружает вид мгновенно:

[btn layoutIfNeeded]; 
bin.layer.cornerRadius = btn.frame.size.width*0.3; 

Кнопки сгруппированы в коллекции выпускной, в случае, когда необходимо знать.

Есть ли у кого-нибудь решение? Спасибо заранее!

Нико

Image 1: This takes about 5-6 seconds

Image 2: This is the View that will be loaded

TileButton.h-файл:

@interface TileButton : UIButton 

@property (nonatomic) int colorMode; 

+ (UIColor *)blue; 
+ (UIColor *)red; 
+ (UIColor *)green; 
+ (UIColor *)yellow; 
+(UIColor *)colorForColorCode:(int)colorCode; 
-(int)colorMode; 

@end 

TileButton.m-файл:

@implementation TileButton 
- (instancetype)init { 
self = [super init]; 
if (self) { 
    self.layer.cornerRadius = self.frame.size.width*0.3; 
} 
return self; 
} 

+(UIColor *)blue { 
return [UIColor colorWithRed:41.0/255.0 green:161.0/255.0 blue:255.0/255.0 alpha:1]; 
} 

+(UIColor *)red { 
return [UIColor colorWithRed:255.0/255.0 green:71.0/255.0 blue:109.0/255.0 alpha:1]; 
} 

+(UIColor *)green { 
return [UIColor colorWithRed:0.0/255.0 green:185.0/255.0 blue:30.0/255.0 alpha:1]; 
} 

+(UIColor *)yellow { 
return [UIColor colorWithRed:255.0/255.0 green:198.0/255.0 blue:26.0/255.0 alpha:1]; 
} 

+(UIColor *)colorForColorCode:(int)colorCode { 
switch (colorCode) { 
    case 1: 
     return [TileButton blue]; 
     break; 
    case 2: 
     return [TileButton red]; 
     break; 
    case 3: 
     return [TileButton green]; 
     break; 
    case 4: 
     return [TileButton yellow]; 
     break; 
    default: 
     return [UIColor blackColor]; 
     break; 
} 
} 

-(int)colorMode { 
if (CGColorEqualToColor(self.backgroundColor.CGColor, [TileButton blue].CGColor)) 
    return 1; 
else if (CGColorEqualToColor(self.backgroundColor.CGColor, [TileButton red].CGColor)) 
    return 2; 
else if (CGColorEqualToColor(self.backgroundColor.CGColor, [TileButton green].CGColor)) 
    return 3; 
else if (CGColorEqualToColor(self.backgroundColor.CGColor, [TileButton yellow].CGColor)) 
    return 4; 
else 
    return -1; 
} 

@end 
+0

Вы _should_ удалить 'layoutIfNeeded'. Это бесполезно и ужасно. – matt

+0

Наряду с удалением вызова 'layoutIfNeeded' все в этом цикле, вероятно, можно было бы переместить в конструктор' TileButton'. – werm098

+0

Можете ли вы попробовать с фоном изображения вместо установки радиуса угла? – HMHero

ответ

0

Почему вы не можете установить радиус угла вне цикла for?

UIButton *btn = [UIButton alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; // set your frame here 
bin.layer.cornerRadius = btn.frame.size.width*0.3; // width stays the same, set it here 
for (TileButton *btn in tiles_btn) { 
    btn.alpha = 0.0; 
    btn.layer.borderColor = [UIColor blackColor].CGColor; 
    btn.layer.borderWidth = 1.0f; 
    // you need to set the button frame here 
    btn.frame = CGRectMake(0,0,0,0); 
    [btn layoutIfNeeded]; 
} 
[self colorTilesWithArray:currentTileColors]; 
+0

Поскольку в коллекции Outlet есть 25 кнопок, и только в for-loop я могу установить cornerRadius для каждой кнопки: / –

0

Предполагая, что TileButton подкласс UIButton, при инициализации, вы можете установить TileButton иметь свой пользовательский цвет, ширину и радиус закругления. Таким образом, все кнопки уже имеют заданную настройку при создании кнопок.

Смежные вопросы