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

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010
  • LearnKey

    LearnKey

    19 AĞUSTOS 2008