SORU
22 AĞUSTOS 2009, CUMARTESİ


UİScrollView zaman merkezi içerik daha küçük

Yakınlaştırma ve kaydırma için kullanılacak olan UIImageView içinde UIScrollView var. Eğer kaydırma resim/içerik kaydırma görünümü daha büyük görünüm eğer her şey düzgün çalışır. Görüntü kaydırma görünümünü daha küçük olduğunda ancak, kaydırma görünümü sol üst köşeye sıkışıyor. Fotoğraflar uygulaması gibi ortada tutmak istiyorum.

Herhangi bir fikir veya örnekler UIScrollView küçük zaman merkezli içerik tutmak hakkında?

İPhone 3.0 ile çalışıyorum.

Aşağıdaki kodu hemen hemen çalışır. Görüntü minimum seviyede zoom ulaştıktan sonra sıkıştır eğer sol üst köşesine döner.


- (void)loadView {
    [super loadView];

    // set up main scroll view
    imageScrollView = [[UIScrollView alloc] initWithFrame:[[self view] bounds]];
    [imageScrollView setBackgroundColor:[UIColor blackColor]];
    [imageScrollView setDelegate:self];
    [imageScrollView setBouncesZoom:YES];
    [[self view] addSubview:imageScrollView];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"WeCanDoIt.png"]];
    [imageView setTag:ZOOM_VIEW_TAG];
    [imageScrollView setContentSize:[imageView frame].size];
    [imageScrollView addSubview:imageView];

    CGSize imageSize = imageView.image.size;
    [imageView release];

    CGSize maxSize = imageScrollView.frame.size;
    CGFloat widthRatio = maxSize.width / imageSize.width;
    CGFloat heightRatio = maxSize.height / imageSize.height;
    CGFloat initialZoom = (widthRatio > heightRatio) ? heightRatio : widthRatio;

    [imageScrollView setMinimumZoomScale:initialZoom];
    [imageScrollView setZoomScale:1];

    float topInset = (maxSize.height - imageSize.height) / 2.0;
    float sideInset = (maxSize.width - imageSize.width) / 2.0;
    if (topInset < 0.0) topInset = 0.0;
    if (sideInset < 0.0) sideInset = 0.0;
    [imageScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [imageScrollView viewWithTag:ZOOM_VIEW_TAG];
}

/************************************** NOTE **************************************/
/* The following delegate method works around a known bug in zoomToRect:animated: */
/* In the next release after 3.0 this workaround will no longer be necessary      */
/**********************************************************************************/
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    [scrollView setZoomScale:scale 0.01 animated:NO];
    [scrollView setZoomScale:scale animated:NO];
    // END Bug workaround

    CGSize maxSize = imageScrollView.frame.size;
    CGSize viewSize = view.frame.size;
    float topInset = (maxSize.height - viewSize.height) / 2.0;
    float sideInset = (maxSize.width - viewSize.width) / 2.0;
    if (topInset < 0.0) topInset = 0.0;
    if (sideInset < 0.0) sideInset = 0.0;
    [imageScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}

CEVAP
22 Mayıs 2010, CUMARTESİ


Çok basit bir çözümü var! İhtiyacınız olan tüm ScrollViewDelegate yakınlaştırma sırasında küme (imageview) merkezinde güncellemek için. Eğer Yakınlaştırılmış görüntü scrollview küçükse o zaman alt görünümünü ayarlayın.başka merkezi (0,0) merkezi.

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{
    UIView *subView = [scrollView.subviews objectAtIndex:0];

    CGFloat offsetX = MAX((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0);
    CGFloat offsetY = MAX((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0);

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5   offsetX, 
                                 scrollView.contentSize.height * 0.5   offsetY);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • martin shervington

    martin sherv

    7 EKİM 2011
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008