2013-01-08 1 views
2

내가 진행하고있는 프로젝트 중 하나에서 사용자가 구입할 자리를 선택하기 위해 누를 수있는 영화 극장 좌석과 유사한 버튼과 레이블이 많은 UIScrollView이 있습니다. . UIScrollView을 확대 할 수 있습니까? 이미 UIScrollViewDelegate으로 선언하고 delegate을 자체로 설정하고 최소 및 최대 줌 배율을 설정했지만 viewForZoomingInScrollViewscrollViewDidEndZooming 방법에 문제가 있습니다. viewForZoomingInScrollView 메서드에서 내 scrollview를 반환하려고했지만 충돌이 발생합니다.Objective-C에 대한 UIScrollview 확대/축소

다음은 코드의 일부입니다 :

- (void) renderSeatMapOnScreen 
{  
    int x_offset_row = 10; 
    int y_offset_row = 25; 
    int x_offset_col = 30; 
    int y_offset_col = 0; 
    int scrollview_w = 0; 
    int scrollview_h = 0; 

    NSString *row_name = @""; 
    int tag_index = 0; 

    NSMutableArray *seat_map_table = [seat_map_xml seats_map]; 
    NSString *seat_available_str = [seat_avail_xml seat_available]; 

    HideNetworkActivityIndicator(); 

    NSLog(@"Seats available = %@", seat_available_str); 

    NSArray *seats_avail = [seat_available_str componentsSeparatedByString:@";"]; 

    int ROW_COL_OFFSET = 25; 

    for (int row = 0; row < [seat_map_table count]; row++) 
    { 
     UILabel * rowlabel = [[UILabel alloc] init]; 
     rowlabel.frame = CGRectMake(x_offset_row , y_offset_row, 22, 22); 

     SeatMapDeclaration *rowmap = [seat_map_table objectAtIndex:row]; 
     rowlabel.text = rowmap.rows; 
     [scrollview addSubview:rowlabel]; 

     row_name = [NSString stringWithFormat:@"%@", rowmap.rows]; 

     NSArray *seat = [rowmap.rowmap componentsSeparatedByString:@";"]; 
     NSLog(@"row[%i] = %@", row, rowmap.rowmap); 

     if (row == 0) 
     { 
      scrollview_w = [seat count] * ROW_COL_OFFSET + y_offset_row; 
      total_column = [seat count]; 
      total_row = [seat_map_table count]; 
     } 

     x_offset_col = 30 ; 
     y_offset_col = y_offset_row ; 

     for (int column = 0; column < [seat count]; column++) 
     { 
      if (([[seat objectAtIndex:column] rangeOfString:@"a("].location != NSNotFound) 
       || ([[seat objectAtIndex:column] isEqualToString:@""])) 
      { 
       CGRect myImageRect = CGRectMake(x_offset_col, y_offset_col, 22, 22); 
       UIImageView *imageView = [[UIImageView alloc] initWithFrame:myImageRect]; 
       [imageView setImage:[UIImage imageNamed:@"noseat.png"]]; 
       [scrollview addSubview:imageView]; 
      } 
      else if ([[seat objectAtIndex:column] rangeOfString:@"b("].location != NSNotFound) 
      { 
       CGRect myImageRect = CGRectMake(x_offset_col, y_offset_col, 22, 22); 
       UIImageView *imageView = [[UIImageView alloc] initWithFrame:myImageRect]; 
       imageView.image = [UIImage imageNamed:@"noseat.png"]; 
       [scrollview addSubview:imageView]; 
      } 
      else 
      { 
       NSString *status = [NSString stringWithFormat:@"%@%@", row_name, [seat objectAtIndex:column]]; 

       BOOL matchedFound = NO; 
       for (int i = 0; i < [seats_avail count]; i++) 
       { 
        if ([[seats_avail objectAtIndex:i] isEqualToString:status]) 
        { 
         matchedFound = YES ; 
         break ; 
        } 
       } 

       if (matchedFound == YES) 
       { 
        UIButton * seat_btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
        [seat_btn setBackgroundImage:[UIImage imageNamed:@"seatavailable.png"] forState:UIControlStateNormal]; 
        [seat_btn setBackgroundImage:[UIImage imageNamed:@"seatactive.png"] forState:UIControlStateSelected]; 
        seat_btn.frame = CGRectMake(x_offset_col, y_offset_col, 22, 22); 
        tag_index = [[seat objectAtIndex:column] intValue]; 
        [seat_btn setTitle:[seat objectAtIndex:column] forState:UIControlStateNormal]; 
        seat_btn.titleLabel.font = [UIFont fontWithName:@"Helvetica" size:12.0]; 
        seat_btn.tag = tag_index + row * 100; 
        [seat_btn addTarget:self 
           action:@selector(checkboxButton:) 
         forControlEvents:UIControlEventTouchUpInside]; 
        [scrollview addSubview:seat_btn]; 

       } 
       else 
       { 
        CGRect myImageRect = CGRectMake(x_offset_col, y_offset_col, 22, 22); 
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:myImageRect]; 
        imageView.image = [UIImage imageNamed:@"seat_not_available.png"]; 
        [scrollview addSubview:imageView]; 
       } 
      } 

      x_offset_col += ROW_COL_OFFSET ; 

      NSString *data = @""; 
      [seatControl addObject:data]; 
     } 
     y_offset_row += ROW_COL_OFFSET; 
    } 

    UILabel *screenlabel = [[UILabel alloc] init]; 
    screenlabel.frame = CGRectMake((scrollview_w-300)/2, 3, 300, 15); 
    screenlabel.text = @"Screen"; 
    screenlabel.backgroundColor = [UIColor blackColor]; 
    screenlabel.textColor = [UIColor whiteColor] ; 
    screenlabel.font = [UIFont fontWithName:@"Helvetica" size:10.0]; 
    screenlabel.textAlignment = UITextAlignmentCenter; 
    [scrollview addSubview:screenlabel]; 

    scrollview_h = y_offset_row + ROW_COL_OFFSET; 
    // Adjust scroll view 
    [scrollview setContentSize:CGSizeMake(scrollview_w, scrollview_h)]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    NSLog(@"1"); 

    return scrollview; 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 
    NSLog(@"2"); 
} 
+0

논외 충돌 보고서를 공유 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html – CarlJ

+0

: 당신은 ObjC 코딩 가이드 라인에 살펴 보셔야 .. 예외 중단 점을 사용하면 충돌에 대한 자세한 정보와 정확한 지점을 얻을 수 있습니다. –

+0

viewForZoomingInScrollView 메서드가 호출 될 때 충돌이 발생합니다. – jaytrixz

답변

1

은에서 :

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    NSLog(@"1"); 

    return scrollview; 
} 

당신은 /를 UIScrollView 자체가 아니라 당신이 원하는 그 서브 뷰가 스크롤 줌을 반환 안된다.

많은 하위 뷰가있는 경우 viewForZoomingInScrollView에서 반환하는 모든 항목에 대한 컨테이너보기를 만드는 것이 좋습니다. 좌석을 스크롤보기 자체에 추가하는 대신 컨테이너보기에 추가 할 수 있습니다.

+0

감사합니다. 사용자가 뷰를 집거나 확대 할 수 있고 여전히 버튼을 탭 할 수 있습니까? 또한 scrollViewDidEndZooming 메서드를 사용해야합니까? – jaytrixz

+0

예, 가능합니다. scrollViewDidEndZooming에 관해서는 당신이 거기에서 무엇을하고 싶은지에 달려있다 ... 시도해보고, 더 많은 것들을 작동시켜야하지만, 기회가 있다는 것을 알기 바란다. – sergio

0

당신이 UIScrollView에서 특정 좌석에 확대하려는 경우, 당신은 zoomToRect: animated:를 사용해야합니다. 확대하려는 특정 직사각형 (즉, 좌석)을 지정할 수 있습니다.

+0

실제로 사용자가 꼬집어서 확대하는 것이 좋을 것입니다. 그 방법으로도 동일한 작업을 수행 할 수 있습니까? – jaytrixz

0

확대/축소는 viewForZoomingInScrollView : delegate 콜백을 구현할 때만 작동합니다.

UIImageView *tempImage = [[UIImageView alloc]initWithImage:[UIImage imageWithData:data]]; 
self.imageView = tempImage; 

scrollView.contentSize = CGSizeMake(imageView.frame.size.width , imageView.frame.size.height); 
scrollView.maximumZoomScale = 1; 
scrollView.minimumZoomScale = .37; 
scrollView.clipsToBounds = YES; 
scrollView.delegate = self; 
[scrollView addSubview:imageView]; 
scrollView.zoomScale = .37; 

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)inScroll { 
    return imageView; 
}