проблема с масштабированием анимации в ScrollView — Ipad

#ipad #uiscrollview #core-animation #zooming #uisplitviewcontroller

#iPad #uiscrollview #ядро-анимация #масштабирование #uisplitviewcontroller

Вопрос:

В моем приложении у меня есть разделенный экран, в котором подробным видом является scrollview. У меня есть 5 таблиц, которые являются подвидами моего scrollview, в котором 3 табличных представления расположены рядом сверху, а 2 табличных представления — рядом снизу

Я уже реализовал способ, при котором, когда я щелкаю по любой из строк любой таблицы в scrollview, этот вид исчезает, а другой вид приближается к его положению.

Я пишу следующий код в didSelectRowAtIndexPath в подвиде средней таблицы,

 CGFloat xpos = self.view.frame.origin.x;
    CGFloat ypos = self.view.frame.origin.y;
    self.view.frame = CGRectMake(xpos 100,ypos 150,5,5);
    [UIView beginAnimations:@"Zoom" context:NULL];
    [UIView setAnimationDuration:2];
    self.view.frame = CGRectMake(xpos,ypos,220,310);
    [UIView commitAnimations];
    [self.view addSubview:popContents.view];
  

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

Однако проблема, с которой я сталкиваюсь, заключается в том, что, поскольку сбоку есть другой подвид таблицы, если я увеличу размер кадра, скажем, до 250 или около того, часть увеличенного вида будет скрыта tableview сбоку (как если бы часть увеличенного вида находилась под tableview сбоку).

Есть ли способ исправить это, чтобы мой увеличенный вид не был скрыт таблицами по бокам?

Надеюсь, я правильно объяснил свою проблему…

Обновить:

Вот код, который я использую для добавления вложенных представлений для scrollview

 // Scroll view
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 30, 1000, 740)];
scrollView.contentSize = CGSizeMake(1000, 700);
scrollView.delegate = self;
scrollView.scrollEnabled = YES;
scrollView.showsHorizontalScrollIndicator = YES;
scrollView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
[self.view addSubview:scrollView];


aView = [[aViewController alloc] initWithNibName:@"aViewController" bundle:nil];
aView.view.frame = CGRectMake(10, 25, 220, 310);
[aView loadList:objPatients];
[scrollView addSubview:aView.view];

bView = [[bViewController alloc] initWithNibName:@"bViewController" bundle:nil];
bView.view.frame = CGRectMake(10, 350, 220, 310);
[bView loadList:objPatients];
[scrollView addSubview:bView.view];

cView = [[cViewController alloc] initWithNibName:@"cViewController" bundle:nil];
cView.view.frame = CGRectMake(240, 25, 220, 310);
[cView loadList:objPatients];
[scrollView addSubview:cView.view];

dView = [[dViewController alloc] initWithNibName:@"dViewController" bundle:nil];
enView.view.frame = CGRectMake(240, 350, 220, 310);
[enView loadList:objPatients];
[scrollView addSubview:dView.view];

eView = [[eViewController alloc] initWithNibName:@"eViewController" bundle:nil];
eView.view.frame = CGRectMake(470, 25, 220, 310);
[eView loadList:objPatients];
[scrollView addSubview:eView.view];
  

скажем, например, я добавляю код для didSelectRowAtIndexPath в подвиде cViewController…

Ответ №1:

Это предположение, поскольку мне нужно было бы знать, как ваши табличные представления добавляются в режим прокрутки, но средний вид таблицы, вероятно, был добавлен раньше, чем боковой. Просмотры «складываются» в том порядке, в котором они добавлены, причем последний из них находится сверху. Вам нужно получить вид прокрутки, чтобы переместить средний вид спереди с помощью этого метода

 - (void)bringSubviewToFront:(UIView *)view
  

Лучшим способом сделать это было бы создать протокол для табличных представлений и делегировать просмотр прокрутки. Метод был бы примерно таким

 - (void) moveAViewToFront: (MyTableView *) aTableView
{
    [self.view bringSubviewToFront: aTableView.view];
}
  

Затем вы должны вызвать метод делегирования перед настройкой анимации.

Отредактировано

Еще немного подумав, я понял, что в подвидах есть ссылка на их superview, поэтому этот фрагмент кода должен дать представление о том, как решить проблему. Я создал тестовое приложение, в котором есть контроллер просмотра, который добавляет два дополнительных представления. Заголовочный файл контроллера просмотра — MoveSubviewViewController.h

 #import <UIKit/UIKit.h>

@interface MoveSubviewViewController : UIViewController
{
}

@end
  

и это реализация

 #import "MoveSubviewViewController.h"
#import "MoveableSubview.h"

@implementation MoveSubviewViewController

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        // Create two overlapping subviews. The blue subview will start at the top of
        //  the frame and extend down two thirds of the frame.
        CGRect superviewFrame = self.view.frame;
        CGRect view1Frame = CGRectMake( superviewFrame.origin.x, superviewFrame.origin.y,
                                       superviewFrame.size.width, superviewFrame.size.height * 2 / 3);
        MoveableSubview *view1 = [[MoveableSubview alloc] initWithFrame: view1Frame];
        view1.backgroundColor = [UIColor blueColor];
        [self.view addSubview: view1];
        [view1 release];

        // The green subview will start one third of the way down the frame and
        //  extend all the to the bottom.
        CGRect view2Frame = CGRectMake( superviewFrame.origin.x,
                                       superviewFrame.origin.y   superviewFrame.size.height / 3,
                                       superviewFrame.size.width, superviewFrame.size.height * 2 / 3);
        MoveableSubview *view2 = [[MoveableSubview alloc] initWithFrame: view2Frame];
        view2.backgroundColor = [UIColor greenColor];
        [self.view addSubview: view2];
        [view2 release];
    }

    @end
  

Класс subview — MoveableSubview с другим простым заголовком

 #import <UIKit/UIKit.h>

@interface MoveableSubview : UIView
{
}
@end
  

и реализация

 #import "MoveableSubview.h"

@implementation MoveableSubview

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Move this view to the front in the superview.
    [self.superview bringSubviewToFront: self];
}

@end
  

Что нужно сделать, так это добавить

 [self.superview bringSubviewToFront: self];
  

строка перед настройкой анимации.

Комментарии:

1. спасибо, что указали на это.. это именно то, что происходит.. Я отредактировал свой вопрос, чтобы включить код .. поэтому я включаю код для didSelectRowAtIndexPath в cViewController, где dViewController и eViewController добавлены после cViewController и, следовательно, они скрывают масштабирование.. Я хотел бы знать, куда мне следует добавить упомянутый вами код и как мне его вызвать? Должен ли я записать это в cViewController или в DetailViewController разделенного представления?

2. На самом деле это проще, чем я изначально думал. Я забыл, что вложенный просмотр автоматически ссылается на свой superview, поэтому вам не нужно использовать протокол и делегировать. Я отредактировал свой первоначальный ответ, чтобы предоставить некоторый пример кода, который должен дать вам решение.

3. Еще раз спасибо, что приложили усилия для решения моей проблемы .. мой проект основан на окне, и, следовательно, я не могу использовать self.superview .. есть ли какой-либо другой способ, которым я могу сделать это в моем случае?

4. В любом случае попробуйте, поскольку в вашем случае scrollview является супервизором, а ViewController [a-d] — это подвиды.

5. Я думаю, что вижу ошибку в своем ответе: self относится к контроллеру просмотра, а self.view относится к его представлению. Попробуйте [self.view.superview возвращает subviewtofront: self];. Извините, что пропустил это. В своем тесте я использовал views, а не view controllers.