Центр ImageView поверх scrollView

Итак, у меня есть два UIImageViews, которые находятся в подвиде UIScrollView. Я хочу, чтобы когда пользователь прокручивал где-нибудь на экране и нажимал на таблицу (кнопку на экране), появлялось всплывающее окно (UIImageview). Я хочу, чтобы изображение отображалось на center. Вот мой код:

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"%f scrollView Last X", scrollView.contentOffset.x);
    NSLog(@"%f scrollView Last y", scrollView.contentOffset.y);

    //This is for the orders
    self.roundFrame = [[UIImageView alloc] initWithFrame:CGRectMake(190 + scrollView.contentOffset.x ,120 + scrollView.contentOffset.y, 385, 280)];
    self.roundFrame.image = [UIImage imageNamed:@"frame_round_edge.png"];
    [_roundFrame setUserInteractionEnabled:YES];

    //This is for the split Table
    self.roundFrameForSplit = [[UIImageView alloc] initWithFrame:CGRectMake(190 +  scrollView.contentOffset.x, 120 + scrollView.contentOffset.y, 370, 300)]; // 362
    self.roundFrameForSplit.image = [UIImage imageNamed:@"frame_round_edge.png"];
    [_roundFrameForSplit setUserInteractionEnabled:YES];
}

Однако происходит то, что в большинстве случаев оно приходит в центр, но иногда оно не приходит в центр. Я не знаю, как это исправить. Кто-нибудь знает, как это исправить? Спасибо за помощь!

РЕДАКТИРОВАТЬ: Для тех, кто ищет ответ на этот вопрос в будущем, вот он. Поскольку в моем случае (ваш может быть другим в зависимости от того, чего вы хотите достичь), я просто хотел, чтобы UIImageView находился в центре экрана ipadMini, поэтому я немного схитрил и жестко закодировал значения (1024/2 и 768/ 2). Не забудьте добавить свой UIImageView в качестве подвида в self.View (я сделал ошибку и потерялся, лол). Надеюсь это поможет !


person Some_random_coder    schedule 29.05.2013    source источник


Ответы (3)


Сделайте imageview вне scrollview и скройте его.

Если вы хотите, чтобы оно отображалось поверх просмотра, укажите его изображение в представлении изображения и отобразите его.

person Ben Coffman    schedule 29.05.2013
comment
Мой scrollView ОГРОМНЫЙ, чтобы позволить пользователю прокручивать. У меня есть изображение поверх него, но всякий раз, когда появляется изображение, я выделяю фон и отключаю взаимодействие (я не позволяю пользователю прокручивать, когда изображение есть). - person Some_random_coder; 30.05.2013
comment
Я не уверен, как их использовать... Можете ли вы привести пример, пожалуйста? - person Some_random_coder; 30.05.2013
comment
Вы можете создать их в конструкторе интерфейсов или программно. Я предлагаю начать с IB. Общая идея ограничений заключается в том, что вы устанавливаете расстояние от фиксированного положения, которое может колебаться в зависимости от размера устройства. Я бы посоветовал прочитать это: developer.apple.com /библиотека/ios/#рецепты/ - person Ben Coffman; 30.05.2013
comment
Спасибо! Но мне интересно, могу ли я просто получить границы мини-экрана ipad и разделить ширину/2 и высоту/2, чтобы центрировать изображение? - person Some_random_coder; 30.05.2013
comment
Вы можете, при условии, что ваше изображение всегда будет одного и того же размера, вам не нужно принимать во внимание вращение, и вы не хотите добавлять что-либо еще, например, рамку вокруг изображения. Все возможно, но НАМНОГО больше работы. - person Ben Coffman; 30.05.2013
comment
Я попробовал следующее: CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width / 2; CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height / 2; Но всякий раз, когда я прокручиваю, местоположение меняется. Я думал, что главный экран должен иметь статический размер реального iPad Mini, не так ли? - person Some_random_coder; 30.05.2013
comment
Нет, тебе нужно использовать вид сверху. Предполагая, что вы используете IB. - person Ben Coffman; 30.05.2013
comment
Я не использую ИБ. Я пробовал это: UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) { return win1.windowLevel - win2.windowLevel; }] последнийОбъект]; UIView *topView = [[подвиды topWindow] lastObject]; - person Some_random_coder; 30.05.2013

Попробуйте написать тот же код в

  • (void)scrollViewDidScroll:(UIScrollView *)scrollView

также, а затем проверить.

person Sachin    schedule 29.05.2013
comment
Должен ли я сохранить (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView или удалить его и заменить этой функцией? Спасибо за быстрый ответ! - person Some_random_coder; 29.05.2013
comment
Используйте оба, потому что 1 вызывается, когда вы перетаскиваете быстро, а 2-й вызывается, когда вы перетаскиваете медленно - person Sachin; 29.05.2013
comment
Спасибо! Похоже, это может сделать это. - person Some_random_coder; 29.05.2013
comment
Идет тестирование QA... свяжемся с вами, как только оно завершится. - person Some_random_coder; 29.05.2013

Это может быть ваша тема. Сделайте эту работу в основном потоке, например, как

  [self performSelectorOnMainThread:@selector(yourMethos:) withObject:YourObject waitUntilDone:NO];

Я надеюсь, что вы понимаете это и можете применить легко. Спасибо

person chandan    schedule 29.05.2013