Подвижность UIView не получает штрихов

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

Ниже показан gif, показывающий поведение, с которым я сталкиваюсь: когда я нажимаю голубую кнопку справа, ничего не происходит (предположение о том, что вид слева должен изменить цвет). Когда я нажимаю зеленую кнопку слева, он правильно получает событие касания, срабатывает прилагаемое действие TouchDown и меняется цвет представления.

введите описание изображения здесь

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

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

Здесь я вставляю код ViewController. Код, который вы видите ниже, – это все, что у меня есть.

import UIKit class ViewController: UIViewController { var originalX : CGFloat! var originalY : CGFloat! var containerView = UIView() var button : UIButton! var button2 : UIButton! override func viewDidLoad() { super.viewDidLoad() originalX = self.view.frame.origin.x originalY = self.view.frame.origin.y button = UIButton(frame: CGRectMake(200, 25, 100, 100)) button.backgroundColor = UIColor.greenColor() button.addTarget(self, action: "foo", forControlEvents: .TouchDown) view.addSubview(button) containerView.frame = CGRectMake(self.view.frame.width, originalY, 150, self.view.frame.height) containerView.userInteractionEnabled = true containerView.backgroundColor = UIColor.magentaColor() containerView.clipsToBounds = false button2 = UIButton(frame: CGRectMake(25, 25, 100, 100)) button2.backgroundColor = UIColor.cyanColor() button2.addTarget(self, action: "bar", forControlEvents: .TouchDown) view.addSubview(containerView) containerView.addSubview(button2) } @IBAction func left() { UIView.animateWithDuration(0.3) { self.view.frame = CGRectMake(self.originalX - 150, self.originalY, self.view.frame.width, self.view.frame.height) } } @IBAction func right() { UIView.animateWithDuration(0.3) { self.view.frame = CGRectMake(self.originalX, self.originalY, self.view.frame.width, self.view.frame.height) } } func foo() { UIView.animateWithDuration(1.0) { self.view.backgroundColor = UIColor.redColor() } } func bar() { UIView.animateWithDuration(1.0) { self.view.backgroundColor = UIColor.blueColor() } } } 

containerView является подзором view , но происхождение containerView имеет право от правого края его родительского представления ( view ) из-за строки:

 containerView.frame = CGRectMake(self.view.frame.width, originalY, 150, self.view.frame.height) 

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

Один из способов его решения – вместо того, чтобы манипулировать фреймом представления, использовать вторичный подзаголовок (называть его overlayView ) для наложения и покрывать containerView , а также управлять его фреймом. Убедитесь, что, по крайней мере, некоторые части обоих представлений находятся в пределах основного вида, чтобы они могли получать события касания.

Для вашего кода вы добавляете containerView в self.view, однако его фрейм не находится в self.view.bounds, поэтому containerView не может получить никакого прикосновения, поэтому то, что вы должны сделать, это

  • просто убедитесь, что self.view достаточно велик, чтобы содержать containerView , по крайней мере содержит button2

или

  • просто анимируйте рамку containerView чтобы сделать ее в self.view

Вы должны держать основной view достаточно большим, чтобы получать события. Используйте self.view.frame.width + 150 как 3-й аргумент для CGRectMake в left() .

Тем не менее, это странное и хрупкое решение того, что вы пытаетесь сделать. Вы не должны перемещать рамку основного вида. Это должно оставаться закрытием всего UIWindow , не более того, не что иное. Вы хотите только оживить subviews и подумать, действительно ли вы используете PageViewController idiom CollectionView идиому UIScrollView или идиому SpriteKit . И подумайте о том, почему вы хотите переместить центральные кнопки управления и ваш центральный ярлык, создавая необычный «прыгающий» интерфейс.

Одна хрупкость делает вычисления макета в viewDidLoad() , что слишком рано в жизненном цикле ViewController. См. Неправильный размер кадра в viewDidLoad

Правильный путь – это хорошая работа: ограничьте пользовательский подкласс UIView, чтобы заполнить основное представление, а затем, если вы должны выполнить раскладки компоновки без layoutSubviews() , сделайте это в переопределенном layoutSubviews() этого пользовательского подкласса – – в этот момент доступна правильная геометрия. (Однако добавление subviews к пользовательскому подклассу UIView в коде не должно выполняться в layoutSubviews () `, а вместо этого при построении или времени пробуждения).

Все становится намного проще, если ваш основной вид не должен двигаться. Если вы свободно читаете Objective-C, попробуйте: http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/

Затем вы получаете реальное разделение проблем, где ваши настройки слайдов действительно самодостаточны. Цитировать:

Вот взаимодействие, которое мы собираемся создать. Это ничего особенного – просто вид, появляющийся с правого края экрана. Особенным является то, что мы фактически представляем контроллер представлений, хотя контроллер представления представления остается видимым.

  • сохранение изображения в библиотеке фотографий с помощью Swift 2.0
  • WKWebView не загружает URL-адрес https?
  • Ошибки в iOS быстро пытаются использовать ансамбли
  • Программно вернуться к предыдущему ViewController в Swift
  • AudioQueueBufferRef в SimplePCMRecorder, показывающий ошибку в swift 3
  • Как заставить панель поиска работать в uicollectionview
  • @import X; Причины ошибки Не удалось создать модуль X
  • Сбой пользовательской клавиатуры iOS 8 при отладке
  • UITextField в UITableViewCell сталFirstResponder после вставки
  • UIStackView пропорциональная компоновка только с внутренним контуром
  • Установка радиуса угла элемента в пользовательском UITableViewCell
  • Давайте будем гением компьютера.