2011-02-07 5 views
0

끝까지 스크롤하여 페이지를 넘기면 처음에는 이상하게 보이는 UIScroll보기가 있습니다. 그러나이 방법은 다음과 같습니다. 클라이언트는 그것을 원했습니다. 웬일인지 때때로 그것은 충돌한다 (실제 iPad에서 더 자주 일어난다). 그리고 그것은 충돌 로그없이 이것을한다. 나는 그것이 기억과 관련이 있어야한다는 느낌이 들었다. 이 충돌을 방지하는 방법이 있습니까? 감사.큰 페이지가 넘기는 UIScrollView가 때때로 충돌합니다.

#import "viewBookVC.h" 
#import "switchVC.h" 
#import "switchExVC.h" 
#import "mainMenuAppDelegate.h" 
#import "exGlobal.h" 

@implementation ViewBookVC 

UIScrollView *scroll; 

UIButton *prevPageButton; 
UIButton *nextPageButton; 

UIImage *scrollImage; 

UIImageView *BGview2; 

NSMutableArray *BGList; 

NSMutableArray *pagingEnabledArr; 

int currentPage = 0; 

int maxPages = 0; 

// used to put a delay on the previous page touch detection 
int prevNextPageDetectDelay = 45; 

int prevNextPageDetectDelayCounter = 0; 

int nextContentOffsetX; 



- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 

     currentPage = 0; 

     maxPages = 0; 

     prevNextPageDetectDelayCounter = 0; 

     mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     // page list 
     BGList = [[NSMutableArray alloc] init]; 

     for(int i = 0; i < 31; i++) { 
      NSString *img = [NSString stringWithFormat:@"Viewbook_%d.png", i]; 
      [BGList addObject:img]; 
     } 


     maxPages = [BGList count]; 


     // scrolling rules for paging being enabled 

     pagingEnabledArr = [[NSMutableArray alloc] init]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"NO"]; 
     [pagingEnabledArr addObject:@"YES"]; 
     [pagingEnabledArr addObject:@"YES"]; 


     timer_checkScrollPos = [[NSTimer scheduledTimerWithTimeInterval:.005 
                   target:self 
                   selector:@selector(onTimer_checkScrollPos:) 
                   userInfo:nil 
                   repeats:YES] retain]; 

     ///////////// 
     //   // 
     // SCROLL // 
     //   // 
     ///////////// 

     //scroll view 
     CGRect scrollContainer = CGRectMake(0, 0, 1024, 768); 
     scroll = [[UIScrollView alloc] initWithFrame:scrollContainer]; 
     [scroll setBackgroundColor:[UIColor blackColor]]; 
     scroll.contentSize = CGSizeMake(1024, 722); 

     scroll.showsHorizontalScrollIndicator = YES; 
     scroll.bounces = NO; 

     scroll.pagingEnabled = YES; 

     [self addSubview:scroll]; 

     // get scroll offset 
     NSLog(@"cOffset(A): %f", scroll.contentOffset.x); 


     //image to use in scroll 
     scrollImage = [UIImage imageNamed:@"Viewbook_0.png"]; 
     BGview2 = [[UIImageView alloc] initWithImage:(UIImage *)scrollImage]; 
     BGview2.frame = CGRectMake(0, 23, 1024, 722); 


     [scroll addSubview:BGview2]; 


     //back button [prev button height was compensated for this button to work] 

     CGRect backBTNFrame = CGRectMake(10, 30, 140, 52); 
     UIButton * viewbook_backButton = [[UIButton alloc] init]; 
     viewbook_backButton.frame = backBTNFrame; 
     UIImage *viewbook_backButtonIMG = [UIImage imageNamed:@"SHIP_button_back.png"]; 
     [viewbook_backButton setImage:viewbook_backButtonIMG forState:UIControlStateNormal]; 
     viewbook_backButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:viewbook_backButton]; 

     [viewbook_backButton addTarget:self 
           action:@selector(kill_timers) 
         forControlEvents:UIControlEventTouchUpInside];  

     [viewbook_backButton addTarget:del.switchVC 
           action:@selector(gotoMain) 
         forControlEvents:UIControlEventTouchUpInside];  


     [viewbook_backButton release]; 





     //prev button 
     CGRect prevPageButtonFrame = CGRectMake(0, 70, 312, 698); 
     prevPageButton = [[UIButton alloc] init]; 
     prevPageButton.frame = prevPageButtonFrame; 
     prevPageButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:prevPageButton]; 

     [prevPageButton addTarget:self 
          action:@selector(prevPage:) 
       forControlEvents:UIControlEventTouchUpInside]; 


     //next button 
     CGRect nextPageButtonFrame = CGRectMake(712, 0, 312, 768); 
     nextPageButton = [[UIButton alloc] init]; 
     nextPageButton.frame = nextPageButtonFrame; 
     nextPageButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:nextPageButton]; 

     [nextPageButton addTarget:self 
          action:@selector(nextPage:) 
       forControlEvents:UIControlEventTouchUpInside]; 



    } 
    return self; 
} 


-(void) onTimer_checkScrollPos:(NSTimer*)timer { 

    if(currentPage!=0){ 
     nextContentOffsetX = 750; 
    }else{ 
     nextContentOffsetX = 0; 
    } 

    //NSLog(@"cOffset(A): %f", scroll.contentOffset.x); 
    if(scroll.contentOffset.x >= nextContentOffsetX){ 
     nextPageButton.hidden = NO; 
    }else{ 
     nextPageButton.hidden = YES; 
    } 

    if(scroll.contentOffset.x <= 274){ 
     prevPageButton.hidden = NO; 
    }else{ 
     prevPageButton.hidden = YES; 
    } 

    prevNextPageDetectDelayCounter += 1; 
} 


- (void)nextPage:(id)sender { 

    if(currentPage!=0){ 
     nextContentOffsetX = 750; 
    }else{ 
     nextContentOffsetX = 0; 
    } 

    if(scroll.contentOffset.x >= nextContentOffsetX & prevNextPageDetectDelayCounter>=prevNextPageDetectDelay){ 

     prevNextPageDetectDelayCounter = 0; 

     currentPage+=1; 

     if(currentPage >= maxPages){ 
      currentPage = 0; 
     } 

     if(currentPage!=0){ 
      scroll.contentSize = CGSizeMake(2048, 722); 
      BGview2.frame = CGRectMake(0, 23, 2048, 722); 
     }else{ 
      scroll.contentSize = CGSizeMake(1024, 722); 
      BGview2.frame = CGRectMake(0, 23, 1024, 722);   
     } 

     [UIView beginAnimations:@"flipping view" context:nil]; 
     [UIView setAnimationDuration:0.8]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp 
           forView:scroll 
           cache:YES]; 
     [scroll setHidden:NO]; 
     [UIView commitAnimations]; 

     if([pagingEnabledArr objectAtIndex:currentPage][email protected]"YES"){ 
      scroll.pagingEnabled = YES; 
     }else{ 
      scroll.pagingEnabled = NO; 
     } 


     BGview2.image = [UIImage imageNamed:[BGList objectAtIndex:currentPage]]; 

     // set scroll offset 
     [scroll setContentOffset:CGPointMake(0,0) animated:NO]; 

    } 
} 

- (void)prevPage:(id)sender { 
    if(scroll.contentOffset.x <= 274 & prevNextPageDetectDelayCounter>=prevNextPageDetectDelay){ 

     prevNextPageDetectDelayCounter = 0; 

     currentPage-=1; 

     if(currentPage < 0){ 
      currentPage = maxPages-1; 
     } 

     if(currentPage!=0){ 
      scroll.contentSize = CGSizeMake(2048, 722); 
      BGview2.frame = CGRectMake(0, 23, 2048, 722); 
     }else{ 
      scroll.contentSize = CGSizeMake(1024, 722); 
      BGview2.frame = CGRectMake(0, 23, 1024, 722);   
     } 

     [UIView beginAnimations:@"flipping view" context:nil]; 
     [UIView setAnimationDuration:0.8]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown 
           forView:scroll 
           cache:YES]; 
     [scroll setHidden:NO]; 
     [UIView commitAnimations]; 

     if([pagingEnabledArr objectAtIndex:currentPage][email protected]"YES"){ 
      scroll.pagingEnabled = YES; 
     }else{ 
      scroll.pagingEnabled = NO; 
     } 

     BGview2.image = [UIImage imageNamed:[BGList objectAtIndex:currentPage]]; 

     // set scroll offset 
     [scroll setContentOffset:CGPointMake(0,0) animated:NO]; 

    } 
} 

-(void) kill_timers{ 
    NSLog(@"kill viewbook timer"); 

    [timer_checkScrollPos invalidate]; 
    timer_checkScrollPos = nil; 

} 

- (void)dealloc { 

    [scroll release]; 

    [BGview2 release]; 

    [BGList release]; 

    [pagingEnabledArr release]; 

    [prevPageButton release]; 
    [nextPageButton release]; 

    [timer_checkScrollPos invalidate]; 
    [timer_checkScrollPos release]; 

    [super dealloc]; 
} 

@end 

답변

0

메모리 관리 문제처럼 들립니다. 한 번에 한두 페이지 만 표시 할지라도 모든 내용을 메모리에로드하고있는 것 같습니다. 코어 데이터 또는 XML을 사용하여 주어진 시간에 절대적으로 필요한 데이터 만로드하는 것이 좋습니다.

시뮬레이터보다 불안정한 장치 인 경우 시뮬레이터는 이 아니며 에뮬레이터는입니다. 시뮬레이터는 Mac의 메모리를 사용하며 iPad의 메모리 제한이 없습니다.

  • 가 Mac에 아이 패드를 접선 시도하고 콘솔 (Cmd를 + 시프트 + R)를 시계 :

    은 몇 가지 옵션이,이 디버깅합니다. 앱에 메모리 경고가 표시되면 경고가 표시됩니다. 레벨 1에는 종종 레벨 2가 뒤따를 때마다 충돌이 뒤 따른다. 이것은 기존 문제의 실체를 입증하는 데 도움이 될 수 있습니다.

  • 할당 계기를 사용하여 앱을 실행하면 앱에서 너무 많은 메모리를 할당 할 수있는 원인을 추적 할 수 있습니다. 누수 도구는 메모리 누수를 찾는 데 도움이됩니다.

  • "빌드 및 분석"이라는 Xcode의 멋진 기능을 활용하십시오. 메모리 누수를 찾는 것이 좋습니다. (빌드 -> 빌드 및 분석)

누출 메모리와 시스템에서 제공 할 필요가없는 메모리 할당 사이에 충돌이 발생했을 수 있습니다.

관련 문제