изменить размер подкласса uiview после создания - PullRequest
2 голосов
/ 31 января 2012

Существует ли быстрый и простой способ изменить размер UIView после его создания, а также изменить размер его подвидов?

У меня есть собственный подкласс UIView, называемый AnagramLetter, реализация и код интерфейса которого показаны ниже:

@interface AnagramLetter : UIView{
    UILabel *letterLbl;
    UIImageView *letterBG;
}
@property (nonatomic, retain) UILabel *letterLbl;
@property (nonatomic, retain) UIImageView *letterBG;
@end


@implementation AnagramLetter
@synthesize letterLbl,letterBG;

- (id)initWithFrame:(CGRect)frame
{
    frame = CGRectMake(0, 0, 166, 235);
    CGRect lblFrame = CGRectMake(1, 1, 164,164);
    self = [super initWithFrame:frame];
    [self setAutoresizesSubviews:YES];
    if (self) {
        // Initialization code
        letterBG = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"anagram_correct_bg.png"]];
        [self addSubview:letterBG];

        letterLbl = [[UILabel alloc] initWithFrame:lblFrame];
        letterLbl.backgroundColor = [UIColor clearColor];
        letterLbl.textColor = [UIColor blackColor];
        letterLbl.textAlignment = UITextAlignmentCenter;
        letterLbl.numberOfLines = 0;
        letterLbl.minimumFontSize = 50;
        letterLbl.font = [UIFont boldSystemFontOfSize:144];
        letterLbl.adjustsFontSizeToFitWidth = YES;
        [self addSubview:letterLbl];
    }
    return self;
}
@end

Когда я нажимаю кнопку в своем пользовательском интерфейсе, я вызываю метод, который генерирует список вышеупомянутых элементов и заполняет UIView вдоль оси X, создавая UIView для каждого символа в данной строке. Прежде чем сделать это, я получаю размеры UIView (называемые anagramHolder), разделенные на количество символов в слове. Затем я устанавливаю границы / фрейм UIView после его инициализации, но до сих пор не было никаких изменений в поведении созданных представлений AnagramLetter.

Ниже приведен код, который я использую для получения измерений, изменения границ созданного подкласса и добавления элемента в anagramHolder UIView.

- (void) createAnagram {
    float aWidth = 166.0;
    float aHeight = 235.0;
    CGRect rect = [anagramHolder bounds];

    if (!anagramCreated){
        for (int i=0; i<[word length]; i++) {
            AnagramLetter *a;
            if ((rect.size.width / [scrambled length]) < 166){
                float percentDiff = ((rect.size.width / [scrambled length]) / 166);
                aWidth = (rect.size.width / [scrambled length]);
                aHeight = aHeight * percentDiff;
                CGRect newBounds = CGRectMake(0, 0, aWidth, aHeight);
                a = [[AnagramLetter alloc] initWithFrame:newBounds];
            }
            else { a = [[AnagramLetter alloc] init]; }
            [a setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
            [a setAutoresizesSubviews:YES];

            CGPoint pos;
            pos.x = (i * (rect.size.width / [scrambled length])) + (aWidth/2);
            pos.y = (rect.size.height/2);
            [a setCenter:pos];
            [a.letterLbl setText:[NSString stringWithFormat:@"%c",[scrambled characterAtIndex:i]]];
            a.tag = i;
            [anagramHolder addSubview:a];
            [anagramLetters addObject:a];
            [a release];
        }
    }
    anagramCreated = YES;
    [self getAnagramResult];
}

1 Ответ

3 голосов
/ 31 января 2012

Самый простой способ автоматически изменить размер подпредставлений определенного view - установить соответствующее значение свойства subviews с именем autoresizingMask.

Например,

UIView *view;
view.autoresizesSubviews = YES;
UIView *subview;
subview.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
[view addSubview:subview];

Из Apple Docs:

UIViewAutoresizing Specifies how a view is automatically resized.

enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 }; 
typedef NSUInteger UIViewAutoresizing;

Более подробную информацию можно найти здесь: UIView

PS Также я использую autoresizingMask для разработки своих приложений для iPhone и iPad.

...