Обработка ротаций в iOS приложение живопись


У меня есть приложение для iOS, поддержка всех ориентаций. Я иногда замечает проблемы с производительностью, когда я поверните устройство, и иногда она падает, сильно. И это не так гладко, как другие приложения. Это мой первый приложение, так что я не профи. У меня есть довольно много пользовательских элементов интерфейса, так что большинство моих взглядов делается программно. Проблема только возникает в один мой вид контроллеров, PageViewController.

Так как я не 100% уверен, где проблема находится, я просто довольно много кода. Поэтому другие советы рефакторинга также будут оценены.

Как я ручкой вращения:

// Suports all directions.
- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation {
    return YES;
}   

// Next and prev buttons is always visible in landscape mode.
// This method sets their frames/locations correctly.
// (This method should have a better name since it also handles undo/redo buttons:)
- (void)setNextAndPrevButtonsInLandscapeMode
{
    [self enableAndDisableNavigationButtons];
    [self enableAndDisableUndoAndRedoButtons];

    previousButton.frame = CGRectMake(-50, 200, 60, 60);
    nextButton.frame = CGRectMake(300, 200, 60, 60);
    undoButton.frame = CGRectMake(-50, 120, 60, 60);
    redoButton.frame = CGRectMake(300, 120, 60, 60); 
    if (editing == NO) {
        [self.view addSubview:previousButton];
        [self.view addSubview:nextButton];
        [self.view addSubview:undoButton];
        [self.view addSubview:redoButton];
    }
}

// Method for handeling orientation change.
- (void)handleOrientation:(UIInterfaceOrientation)orientation
{
    if (orientation == UIInterfaceOrientationPortrait || orientation ==   UIInterfaceOrientationPortraitUpsideDown) {
        toolImageView.frame = CGRectMake(self.view.frame.size.width - 70, 12,   toolImageView.frame.size.width, toolImageView.frame.size.height);

        if (editing) {
            pageView.bounds = editingPortraitPaperRect;; 
            bottomMenu.frame = editingPortraitMenuRect;
        } else {
            bottomMenu.frame = defaultPortraitMenuRect;
        } 

        self.pageView.transform = CGAffineTransformIdentity;
        self.pageView.transform = CGAffineTransformMakeRotation(M_PI * (0) / 180.0);
        self.pageView.transform = CGAffineTransformScale(self.pageView.transform,1.0,1.0);
        self.view.bounds = self.view.frame;
    } 

    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {        

        [self setNextAndPrevButtonsInLandscapeMode];
        toolImageView.frame = CGRectMake(410, 7, toolImageView.frame.size.width,  toolImageView.frame.size.height);


        if (editing) {
            pageView.bounds = editingLandscapePaperRect;
            bottomMenu.frame = editingLandscapeMenuRect;
        } else {
            bottomMenu.frame = defaultLandscapeMenuRect;
        }

        self.pageView.transform = CGAffineTransformIdentity;
        self.pageView.transform = CGAffineTransformMakeRotation(M_PI * (0) / 180.0);
        self.pageView.transform =   CGAffineTransformScale(self.pageView.transform,0.65,0.65);
        self.view.bounds = CGRectMake(-83.7, 73.7, 480.0f, 268.0f);
    } 

}

// Where most of the rotation works occurs
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self handleOrientation:toInterfaceOrientation];
}

- (void)didRotateFromInterfaceOrientation:  (UIInterfaceOrientation)fromInterfaceOrientation
{

    // Resets next/prev buttons to portrait positions.
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait ||  self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {       
        previousButton.frame = CGRectMake(2, 2, 60, 60);
        nextButton.frame = CGRectMake(self.view.frame.size.width - 60 - 2, 2, 60, 60);
        undoButton.frame = CGRectMake(self.view.frame.size.width / 2 - 67, 2, 60, 60);
        redoButton.frame = CGRectMake(self.view.frame.size.width / 2 + 3, 2, 60, 60);      
        if (editing == NO) {
            [previousButton removeFromSuperview];
            [nextButton removeFromSuperview];
            [undoButton removeFromSuperview];
            [redoButton removeFromSuperview];
        }
    }
}

Здесь находится главная точка зрения, относится к этому контроллеру вид:

#import "PageView.h"
@implementation PageView
@synthesize paperView;
@synthesize canvas;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {        
        if (paperView == nil) {
            paperView = [[PaperView alloc] initWithFrame:frame];
            [self addSubview:paperView];

            UIImage * ringImage = [UIImage imageNamed:@"BigNoteblockRings.png"];
            UIImageView * ringView = [[UIImageView alloc] initWithImage:ringImage];            
            CGRect ringRect = CGRectMake(- ringView.frame.size.width / 2 - 15, 5,   ringView.frame.size.width, ringView.frame.size.height);
            ringView.frame = ringRect;
            [paperView addSubview:ringView];            
        }

        if (canvas == nil) {
            /*
             Canvas is the area/context where the painting occurs.
             The image is accessed through UIImageView's .image method.
             */
            canvas = [[UIImageView alloc] init];
            canvas.frame = frame;
            [self addSubview:canvas];
        }        
    }
    return self;
}

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



688
5
задан 10 декабря 2011 в 12:12 Источник Поделиться
Комментарии