2015-06-17 4 views
1

У меня есть UIScrollView (с четким фоном), а за ним у меня есть UIImage, который занимает около 1/3 высоты устройства. Для первоначального отображения изображения, которое сидит в виде прокрутки, я установил для содержимого прокрутки viewInset значение, равное высоте изображения. Это делает именно то, что я хочу, инициализируя показ изображения, но прокрутка вниз в конечном итоге покрывает изображение содержимым прокрутки.UIScrollView прокрутка по фону

Единственная проблема - я добавил кнопку на изображение. Однако его нельзя коснуться, потому что UIScrollView фактически находится поверх него (даже если кнопка видна из-за чистого фона). Как я могу заставить это работать.

enter image description here

enter image description here

Edit:

Следующая решить эту проблему:

//viewdidload 
    self.scrollView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "onScrollViewTapped:")) 
    ... 
    func onScrollViewTapped(recognizer:UITapGestureRecognizer) 
     { 
      var point = recognizer.locationInView(self.view) 
      if CGRectContainsPoint(self.closeButton.frame, point) { 
        self.closeButton.sendActionsForControlEvents(UIControlEvents.TouchUpInside) 
      } 
     } 

ответ

1

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

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

Пожалуйста, дайте мне знать, если это сработает для вас.

+0

Вид прокрутки сверху, так что изображение и кнопка отображаются за ним в фоновом режиме. При прокрутке прокручивается над этим изображением и скрывает их. –

+0

Я добавил 2 скриншота –

+1

@Ben_hawk вы не поняли Роб ответ. Он сказал, чтобы добавить кнопку в свой контент 'UIScrollView' не к изображению. Таким образом можно нажать кнопку. И кнопка будет прокручиваться вне представления, когда вы прокручиваете вверх, так что все должно быть хорошо. – pteofil

0

Две вещи, чтобы проверить:

1) Убедитесь, что изображение, которое содержит кнопку имеет userInteractionEnabled набор для true (по умолчанию является ложным). Хотя, поскольку кнопка является подвью и добавлена ​​поверх ImageView (я предполагаю), это может не помочь.

2) Если это не поможет, можете ли вы добавить кнопку в качестве subview из UIScrollView и установить ее положение, где находится изображение? Таким образом, он должен оставаться на изображении и будет скрыт, когда пользователь прокручивается вниз, но доступен для кликов, поскольку он является дочерним элементом ScrollView.

Некоторый код и/или изображения также помогут.

+0

Для пункта 2 это не создаст желаемого эффекта. Фоновое изображение и кнопка должны оставаться фиксированными и прокручиваться сверху. Тот же эффект можно увидеть в приложении «Карты Google» при просмотре деталей места. Кнопка изображения места и задней кнопки фиксирована вверху, а детали места прокручиваются поверх них. –

+0

Я добавил 2 снимка экрана. –

0

Я думаю, что способ сделать это - подкласс любых объектов в вашем UIScrollView и переопределить touches began/touches ended. Затем выясните, какие координаты касаются и попадают ли они в пределах вашей кнопки

например. в Swift это будет:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) { 

     println("!!! touchesBegan") 

     if var touch = touches.first { 

      var touchObj:UITouch = touch as! UITouch 

      println("touchesBegan \(touchObj.locationInView(self))") //this locationInView should probably target the main screen view and then test coordinates against your button bounds 


     } 
     super.touchesBegan(touches, withEvent:event!) 
    } 

См: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/index.html#//apple_ref/occ/instm/UIResponder/touchesBegan:withEvent:

И: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITouch_Class/index.html#//apple_ref/occ/instm/UITouch/locationInView:

+0

. Вы также можете сравнить с touchs.Ended для wiggle room :) – dijipiji

0

Вы должны создать подкласс UIScrollView и переопределить -hitTest:withEvent:, как это так, чтобы убедиться, что он ест только штрихи, которые должен ,

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *const inherited = [super hitTest:point withEvent:event]; 

    if (inherited == self) return nil; 

    return inherited; 
} 

Также убедитесь, что установлен userInteractionEnabled в YES на ваш взгляд изображения.

1

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

enter image description here

+0

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

0

Существует 2 способа вы можете проверить, что погода сенсорный событие огонь по UIButton или нет?

Вариант 1: Вам необходимо добавить UITapGesture на UIScrollView. нажав на UIScrollView. Коснитесь точки касания касания касания к UIScrollView. вам нужно преобразовать эту точку касания по отношению к основному UIView (то есть self.view), используя следующий метод.

CGPoint originInSuperview = [superview convertPoint:CGPointZero fromView:subview]; 

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

CGRectContainsPoint(buttonView.frame, point) 

Вариант 2: Received первого прикосновения событие во время касания пользователя на экране iPhone. и перенаправить точку касания на текущий UIViewController. где вы можете проверить взаимодействие, как в вариант 1 описать. и выполните свое действие.

Вариант 2 уже интегрирован в один из моих проектов, но я забыл библиотеку, которая получила первое событие крана и перенаправлена ​​на текущий контроллер. когда я узнаю его имя, я напомню.

Это может вам помочь.

+1

Я думаю, что мне удалось добиться этого с помощью варианта один, не уверен, есть ли лучший способ, но я обновил свой вопрос с помощью решения, к которому я пришел. –

+0

@Ben_hawk, спасибо за вашу оценку. –

Смежные вопросы