Cocoa Touch: Создание и добавление индивидуального просмотра

StackOverflow https://stackoverflow.com/questions/2990887

  •  24-10-2019
  •  | 
  •  

Вопрос

Я создаю пользовательский вид в Cocoa Touch, который суперклассирован Uivewie бесконечная петля. Я неправильно создаю свой индивидуальный просмотр? Вот MainView

- (void)loadView {
    UIImage* tempImage = [UIImage imageNamed: @"image1.jpg"];
    CustomImageContainer *testImage = [[CustomImageContainer alloc] initWithImage: tempImage andLabel: @"test image" onTop: true atX: 10 atY: 10];
    [self.view addSubview: testImage];
}

и CustomamageContainer

-(CustomImageContainer *) initWithImage: (UIImage *)imageToAdd andLabel: (NSString *)text onTop: (BOOL) top atX: (int) x_cord atY: (int) y_cord{
    UIImageView *imageview_to_add = [[UIImageView alloc] initWithImage: imageToAdd];
    imageview_to_add.frame = CGRectMake(0, 0, imageToAdd.size.width, imageToAdd.size.height);
    UILabel *label_to_add = [[UILabel alloc] init];
    label_to_add.text = text;
    label_to_add.alpha = 50;
    label_to_add.backgroundColor = [UIColor blackColor];
    label_to_add.textColor = [UIColor whiteColor];
    [self addSubview: imageview_to_add];
    self.frame = CGRectMake(x_cord, y_cord, imageToAdd.size.width, imageToAdd.size.height);
    if (top) {
        label_to_add.frame = CGRectMake(0, 0, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height);
        //[self addSubview: label_to_add];
    }
    else {
        label_to_add.frame = CGRectMake(0,.2 * imageview_to_add.frame.size.height, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height);
    }
    [self addSubview: label_to_add];
    [super  init];
    return self;
}
Это было полезно?

Решение

Почему ты положил [super init] Заявление в конце инициализатора? При подклассии вы обычно ставите это утверждение в начале метода.

За Uiview Подклассы назначенный инициализатор при создании представлений в коде - это initWithFrame:, поэтому вам следует позвонить, прежде чем добавить этикетку и изображение. Вы можете использовать изображение для вычисления рамки, необходимой для пользовательского представления.

-(CustomImageContainer *) initWithImage: (UIImage *)imageToAdd andLabel: (NSString *)text onTop: (BOOL) top atX: (int) x_cord atY: (int) y_cord{
    // The view will gets its frame to the size of the image
    UIImageView *imageview_to_add = [[UIImageView alloc] initWithImage: imageToAdd];

    // Call the designated initializer
    CGRect frame = CGRectMake(x_cord, y_cord, imageToAdd.size.width, imageToAdd.size.height);
    self = [super initWithFrame:frame];

    [self addSubview: imageview_to_add];

    UILabel *label_to_add = [[UILabel alloc] init];
    label_to_add.text = text;
    label_to_add.alpha = 50;
    label_to_add.backgroundColor = [UIColor blackColor];
    label_to_add.textColor = [UIColor whiteColor];

    if (top) {
        label_to_add.frame = CGRectMake(0, 0, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height);
    }
    else {
        label_to_add.frame = CGRectMake(0,.2 * imageview_to_add.frame.size.height, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height);
    }
    [self addSubview: label_to_add];

    return self;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top