пользовательское управление наложением на UIWebView одним касанием / касанием в iphone - PullRequest
0 голосов
/ 31 марта 2011

http://startupmeme.com/wp-content/uploads/2008/09/stanza-on-iphone.png

Я хочу добиться такой же функциональности, как показано на скриншоте известного приложения Stanza.

  1. Контент отображается с помощью UIWebView в формате html

  2. Одно нажатие на UIWebView покажет два оверлейных элемента управления (верхний и нижний)

  3. Нижняя панель инструментов состоит из элементов управления и ползунка для разбиения на страницы.

Пожалуйста, помогите.

Как бы я мог достичь вышеизложенного следующим образом:

  1. Как создать эти пользовательские элементы управления?

  2. Вкл.одно касание, как мне наложить эти элементы управления?

  3. Как мне объединить UIToolbar (который содержит элементы управления) и ползунок?

  4. Такженеобходим эффект слайдера перехода, верхний колонтитул находится сверху экрана, нижний элемент управления и слайдер располагаются снизу экрана.Как мне этого добиться?

Пожалуйста, помогите мне подробно для (a) - (d).Некоторое руководство по коду было бы очень полезно.

Спасибо

Ответы [ 2 ]

5 голосов
/ 11 июня 2011

Я делаю то, что вы ищете в проекте, над которым я недавно работал.

По сути, у меня есть UIWebView внутри UINavigationController с UIToolbar в качестве родственного элемента UIWebView.Я установил макет всего этого, используя IB, чтобы создать кончик, связанный с моим классом контроллера представления.Я предполагаю, что вы знаете, как использовать IB и как правильно настроить все делегаты, IBOutlets и т. Д., Поэтому здесь это не рассматривается.

Вам необходимо реализовать соответствующие делегаты в вашем контроллере представления для этого для всехРабота.Вот мой интерфейс для класса контроллера представления:

@interface MyViewController : UIViewController <UIWebViewDelegate, UIGestureRecognizerDelegate> {

}

@property (retain) IBOutlet UIWebView *webView;
@property (retain) IBOutlet UINavigationItem *navigationItem;
@property (retain) IBOutlet UIToolbar *toolbar;

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer;

// UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

// UIWebViewDelegate methods
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

@end

Технически, о чем вы спрашиваете, требуется только реализация UIGestureRecognizerDelegate, но я предполагаю, что вы будете делать что-то интересное в вашем webView и, следовательно, захотите также реализоватьUIWebViewDelegate

Я обнаружил, что крайне важно реализовать следующее для этих трех методов делегата UGestureRecognizer, чтобы все это работало, поскольку UIWebView также распознает касания:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return YES;
}

Я регистрирую UITapGestureRecognizer наwebView в методе viewDidLoad моего контроллера:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    // I perform other appropriate initialization here like adding or removing items from the navigation bar or toolbar

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
    tapRecognizer.numberOfTapsRequired = 1;
    tapRecognizer.delegate = self;
    [self.webView addGestureRecognizer:tapRecognizer];
    [tapRecognizer release];
}

Вот мой обратный вызов handleTapFrom:

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer
{
    CGPoint location = [recognizer locationInView:self.navigationController.topViewController.view];
    CGRect bounds = self.navigationController.topViewController.view.bounds;

    if (location.x < bounds.size.width / 5.0) {
        // This is in the left most quadrant

        // I implement code here to perform a "previous page" action
    } else if (location.x > bounds.size.width * 4.0 / 5.0) {
        // This is in the right most quadrant

        // I implement code here to perform a "next page" action
    } else if ((location.x > bounds.size.width / 3.0) && (location.x < bounds.size.width * 2.0 / 3.0)) {
        // This is in the middle third
        BOOL hidden = [self.navigationController isNavigationBarHidden];

        // resize the height of self.webView1, self.webView2, and self.webView3 based on the toolbar hiding / showing
        CGRect webViewControllerFrame = self.webView.frame;
        webViewControllerFrame.size.height += (hidden ? -44 : 44);
        self.webView.frame = webViewControllerFrame;

        // I hide all of the upper status bar and navigation bar, and bottom toolbar for a clean reading screen
        [[UIApplication sharedApplication] setStatusBarHidden:!hidden];
        [self.navigationController setNavigationBarHidden:!hidden animated:YES];
        self.toolbar.hidden = !hidden;

        // I perform content relayout here in the now modified webView screen real estate
    }
}

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

Примечания:

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

Прозрачность, которую вы показываете на скриншоте Stanza, не имеет большого значения.Для этого вам придется поиграть с настройками альфа-канала на различных панелях навигации / панели инструментов, а также изменить код изменения размеров в UIWebView выше.Фактически я периодически накладываю на дополнительную полупрозрачную панель инструментов для временного состояния, предупреждений и т. Д. И не изменяю размер UIWebView, чтобы он находился снизу и оставался видимым через эту панель инструментов предупреждений.

0 голосов
/ 09 марта 2012

bg четко понимает механику iPhone, поэтому определенно +1 там, но я мог бы знать другой способ.

Наложение кнопки (или вида) на верхнюю часть.

Зарегистрируйте ловушку крана, однакоВы хотите (Распознаватель, касания, завершившиеся [[касаниями события] tapCount] или IB, или ручное действие ... в основном захваты касаний).

После того, как вы нажали крана, сохраните, где он был, вызовите функциюкоторый уведомляет ваше веб-представление о разделении (или, если оно похоже на строфу, говорит, что нужно добавить оверлей), затем буквально отправляет касание через представления, «имитируя» касание, похожее на это: Есть ли способ пропустить касания черезна iPhone?

или создайте свой собственный метод целевого действия и отправьте его (возможно, проще).

Если вы понимаете SDK, вышеприведенное должно иметь смысл для вас.В частности, виды и все, что связано (кроме графики, вы можете пропустить это чтение)

...