2

在我正在进行的一个项目中,我有一个UIScrollView有很多按钮和标签的按钮和标签,这些按钮和标签类似于电影院座位,用户可以点击它们来选择座位供他们购买。可以缩放UIScrollView吗?我已经声明了UIScrollViewDelegate,将 设置delegate为 self ,设置了最小和最大缩放比例,但是我遇到了viewForZoomingInScrollViewscrollViewDidEndZooming方法的问题。我试图在该viewForZoomingInScrollView方法上返回我的滚动视图,但它崩溃了。

这是一些代码:

- (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");
}
4

3 回答 3

1

在:

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

  return scrollview;
}

你不应该返回它UIScrollView本身,而是你想要滚动/缩放的子视图。

如果您有很多子视图,我建议为您返回的所有子视图创建一个容器视图viewForZoomingInScrollView;而不是将您的座位添加到滚动视图本身,然后将它们添加到容器视图中。

于 2013-01-08T09:24:25.820 回答
0

如果你想放大到某个座位中UIScrollView,你应该使用zoomToRect: animated:。您可以指定要放大到的某个矩形(即座位)。

于 2013-01-08T09:19:43.547 回答
0

缩放仅在您实现 viewForZoomingInScrollView: 委托回调时有效。

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;
}
于 2013-01-08T10:35:41.540 回答