iOS Как обновить ScrollView при смене модели? - PullRequest
5 голосов
/ 23 марта 2012

Я новичок в программировании для iOS и имею ограниченные знания iOS и Objective-C, поэтому, пожалуйста, помогите мне.

Я работаю над приложением для фотографий flickr, которое, в основном, требует данные о фотографии из API flickr и представляет их в scrollView.

Но я столкнулся с некоторой проблемой в моей версии для iPad, представленной с помощью UISplitViewController. Позвольте мне дать простое введение в мое приложение.

MASTER VIEW: список UITableViewController, встроенный в UINavigationViewController, в основном он просто использует API-интерфейс Flickr для получения некоторых данных, представляя что-то вроде этого:

navigationController ->

tableViewControllerA (фотографии организованы по странам) ->

tableViewControllerB (список фотографий в этой стране) Когда фотография выбрана в TableViewControllerB, в моем коде я передаю URL фотографии (из flickr API) в мой контроллер подробного просмотра, который представляет собой scrollView, и вот мой код в scrollView ViewController.

IBOutlet UIScrollView *scrollView;
IBOutlet UIImageView *imageView;
NSURL *photoURL;


- (void) viewDidLoad
{
    [super viewDidLoad];

    dispatch_queue_t downloadQueue = dispatch_queue_create("flickr donwloader", NULL);
dispatch_async(downloadQueue, ^{
    // load image
    self.imageView.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:self.photoURL]];

    dispatch_async(dispatch_get_main_queue(), ^{

        // configure scrollView and imageView
        CGSize photoSize = self.imageView.image.size;

        self.scrollView.delegate = self;
        [self.scrollView setZoomScale:1.00];
        [self.scrollView setMinimumZoomScale:0.5];
        [self.scrollView setMaximumZoomScale:1.00];
        self.scrollView.contentSize = photoSize;

        self.imageView.frame = CGRectMake(0, 0, photoSize.width, photoSize.height);

        CGPoint scrollCenter = self.scrollView.center;
        self.imageView.center = scrollCenter;
    });
});
dispatch_release(downloadQueue);

и в главном представлении, когда изображение выбрано, я устанавливаю свойство photoURL элемента detailView (scrollView), поэтому я переопределяю метод установки photoURL

-(void) setPhotoURL:(NSURL *)photoURL
{
    // do something to refresh my scrollView, below are something I already tried
    self.imageView.image =  [UIImage imageWithData: [NSData dataWithContentsOfURL:self.photoURL]];
    [self.scrollView setNeedsDisplay];
    [self.view setNeedsDisplay];
    [self.imageView setNeedsDisplay];
}

моя цель состоит в том, чтобы, когда моя модель (photoURL) показала, мой scrollView должен дать мне соответствующий imageView, но когда мое приложение запустилось и я выбрал фотографию, scrollView не "обновился", я уже научился обновлять UITableView (self.tableView reloadData), но я действительно не знаю, как это сделать, пожалуйста, помогите!

PS:

1 Пожалуйста, простите меня за плохой английский -_- Я уже пытался объяснить как можно яснее.

2 У меня недостаточно репутации, чтобы обновлять изображение, чтобы вы, ребята, полностью поняли, что такое мое приложение, надеюсь, вы поймете только то, что я сказал


UPDATE: Я использую механизм KVO вместо переопределения метода set для photoURL, но [self.scrollView setNeedsDisplay] все еще не работает.

Я использую отладчик для отслеживания прогресса, KVO работает, но ничего не происходит после [self.xxx setNeedsDisplay], я полностью сбит с толку и не знаю, что делать.

enter image description here

Ответы [ 3 ]

1 голос
/ 18 июля 2015

Вызовите [self.view setNeedsLayout] вместо setNeedsDisplay.Это обновит все вспомогательные представления для вашего представления, включая scrollView.

1 голос
/ 23 марта 2012

Вы должны использовать KVO, не переопределяя сеттеры:

-(void) viewDidLoad
{
    ...
    [self addObserver:self forKeyPath:@"photoURL" options:0 context:NULL];
    ...
}

-(void) observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{
    if ([keyPath isEqualToString:@"photoURL"])
    {
        self.imageView.image =  [UIImage imageWithData: [NSData dataWithContentsOfURL:self.photoURL]];
        [self.scrollView setNeedsDisplay];
        [self.view setNeedsDisplay];
        [self.imageView setNeedsDisplay];
    }
}

И не забывайте @synthesize свои свойства!

0 голосов
/ 26 декабря 2016

У меня есть версия Swift и я не знаю, будет ли она работать для вас или нет, но она работала для меня.

  1. Просто напишите свой кодв viewDidLayoutSubviews() как показано ниже

    override func viewDidLayoutSubviews() {
    self.scroller.contentSize = CGSize(width: self.view.frame.width, 
    height: self.websiteLabel.frame.maxY + 20)
    }
    
  2. И вызовите этот метод в viewDidAppear() как ...

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    viewDidLayoutSubviews()       
    }
    

НадеюсьПоможем вам, ребята ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...