Задача C: проблема фона и кадра при смене ориентации - PullRequest
3 голосов
/ 18 ноября 2011

У меня возникают проблемы с фоном и рамкой, когда я переключаю свой iPad в альбомную ориентацию.

Портрет:

enter image description here

Пейзаж: я не могунарисовать на той стороне после желтой стрелки, и мой фон все еще в портретном и повторяется.

enter image description here

Вот мой код

на viewDidLoad:

    background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"mickey.png"]];
    self.view.backgroundColor = background;

    touchDraw = [[UIImageView alloc] initWithImage:nil];
    touchDraw.frame = self.view.frame;
    [self.view addSubview:touchDraw];
    [self.view sendSubviewToBack:touchDraw];
    touchMoved = 0;

на прикосновенияхMoved:

    touchSwiped = YES;
    UITouch *touch = [touches anyObject];   
    currentTouch = [touch locationInView:self.view];
    currentTouch.y -= 20;
    UIGraphicsBeginImageContext(self.view.frame.size);
    [touchDraw.image drawInRect:CGRectMake(0, 0, touchDraw.bounds.size.width, touchDraw.bounds.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 25.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), redAmt, greenAmt, blueAmt, alpha);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), endingPoint.x, endingPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentTouch.x, currentTouch.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    touchDraw.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    endingPoint = currentTouch;

    touchMoved++;

    if (touchMoved == 10) {
        touchMoved = 0;
    }

Это для моего школьного проекта.

ОБНОВЛЕНИЕ:

Когда я применил autoResizingMask, это происходит на прикосновенияхMoved.

enter image description here

возможно из-за этой строки:

[touchDraw.image drawInRect:CGRectMake(0, 0, touchDraw.bounds.size.width, touchDraw.bounds.size.height)];

Я пытался исправить это раньше, но все так же.

1 Ответ

1 голос
/ 18 ноября 2011

Из быстрого чтения вашего кода, вот мое предположение о том, что не так.

Ваш основной вид реагирует на изменение ориентации, поэтому он перерисовывается при повороте устройства.Вы нарисовали шаблон, и шаблоны повторяются.Если вы хотите, чтобы фон не повторялся, вам нужно создать UIImageView и установить для его изображения значение «mickey.png»

Созданному представлению (touchDraw) дается рамка, когдаон создается, и он не обновляется динамически при повороте iPad.

Я думаю, все, что вам нужно сделать, это:

touchDraw.autoresizingMask = UIViewAutoresizingFlexibleHeight
    | UIViewAutoresizingFlexibleWidth;

Это говорит о том, что он должен автоматически-приспосабливаться при изменении ориентации.

Возможно, вам также понадобится добавить этот метод в контроллер представления (я забыл, что для этого используется по умолчанию):

- (BOOL)shouldAutorotateToInterfaceOrientation:
    (UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

Вы можете иметь более точныйДетальный контроль над изменениями ориентации путем добавления этих двух методов в ваш контроллер представления:

- (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation) orient
                                duration: (NSTimeInterval) duration

и

- (void) didRotateFromInterfaceOrientation:
    (UIInterfaceOrientation) orientation {

Обратите внимание, что трудно увидеть, где находятся ваши виды без рамки.Для отладки вы можете установить границу, используя:

    touchDraw.layer.borderWidth = 1;
    touchDraw.layer.borderColor = [[UIColor blackColor] CGColor];

Я думаю, чтобы получить доступ к свойству слоя выше, вам также нужно будет включить этот #import:

#import <QuartzCore/QuartzCore.h>

Когда я 'Играя с местами для моих видов, я часто добавляю границы, чтобы четко видеть, где находятся мои виды.

Обратите внимание, что, вероятно, в "Интерфейсном конструкторе" есть настройка для автоматического поворота,но вы создаете свое представление в C-коде, поэтому оно не устанавливается.

...