UIButton не смог правильно зарегистрировать сенсорный экран в нижней части экрана iPhone

У меня есть приложение со множеством различных кнопок, расположенных в калькуляторе, как квадратный / прямоугольный формат. На самом деле это очень похоже на калькулятор iOS по умолчанию. Есть приблизительно 6 строк с 4 столбцами каждая из кнопок.

проблема

Проблема, с которой я сталкиваюсь, включает в себя кнопки в нижнем ряду (приблизительно нижний 10-й экран на iPhone 4). Они не ведут себя нормально при нажатии в том смысле, что при нажатии они должны быть нажаты и удерживаться (примерно на секунду) для регистрации нажатия кнопки. Это противоречит стандартному кратковременному крану.

Никакие другие кнопки, кроме этого нижнего ряда, не ведут себя таким образом.

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

Следует также отметить, что эта проблема присутствует только на физических устройствах. На симуляторе кнопки ведут себя нормально.

контекст

Представление, содержащее эти кнопки, не является контроллером корневого представления приложения. Вместо этого он переходит к такому (ничего не придумал здесь):

[self presentViewController:navController animated:YES completion:nil]; 

Где self является контроллером корневого представления

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

То, что я пробовал до сих пор

  • Включение и выключение автомаркета: та же проблема

  • Перестановка иерархии представлений: я переместил проблематичные кнопки сверху и сзади всех других представлений с тем же результатом: та же проблема

  • Несколько устройств (iPhone 4, 4s, 5): одна и та же проблема (хотя кнопки обычно реагируют на 3,5-дюймовые и 4-дюймовые симуляторы)

  • Тестирование других приложений (когда кнопки в этой области нажаты в других приложениях, они ведут себя нормально)

Дополнительная информация

  • Все выложено в Interface Builder для контроллера проблемных представлений
  • Все кнопки являются системными кнопками со стандартными настройками и все они точно совпадают с их текстом.
  • Все элементы экрана (кнопки, метки и т. Д.) Являются подзонами «представления»,
  • Кнопки находятся на одном уровне друг с другом и не должны перекрывать более одного или двух пикселей.
  • Проблемные кнопки имеют размеры: 80 ширина X 44 высота.
  • Проблемные кнопки скрыты от нижней части экрана
  • В дополнение к кнопкам есть один UIImage и несколько меток, однако они находятся в верхней части экрана и никоим образом не перекрываются ни с одной из кнопок.

  • UIButton с IB_DESIGNABLE вызывает предупреждение атрибута времени выполнения и не отображается в Interface Builder
  • Как проверить изображение кнопок в Xcode
  • Откройте приложение Apple Maps с инструкциями из моего приложения iOS iOS 9 Swift 2.2
  • Как добавить пользовательскую библиотеку объектов UIButton в Interface Builder?
  • UIButton в коде
  • UIButton в UITableViewCell не выделяет при нажатии
  • ios 8 - кнопки в горизонтальном прокрутке, перехватывающие событие панорамы - прокрутка не работает
  • Как я могу избежать обрезания текста заголовка UIButton?
  • 7 Solutions collect form web for “UIButton не смог правильно зарегистрировать сенсорный экран в нижней части экрана iPhone”

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

    Здесь есть два возможных вопроса:

    • Может возникнуть взаимодействие (т. Е. Конфликт) между возможностью жестов, направленной на ваше приложение, и жестом, направленным на систему. Если у вас есть распознаватели жестов, вам, возможно, придется использовать методы делегата для посредничества между ними и распознавателями жестов системы.

    • Существует хорошо установленная ошибка, когда работает крана возле края экрана (т. Е. В зоне зон распознавания жестов экрана), но это заставляет кнопку плохо себя вести физически , т. Е. Она выглядит не так, как если бы ее прослушивали, даже если запись показывает, что он имеет (см. мой ответ здесь: https://stackoverflow.com/a/22000692/341994 ).

    Причиной этой проблемы является то, что Apple, похоже, помещает GestureRecognizer в нижней части экрана, что задерживает штрихи в любом другом представлении. После возиться с распознавателями жестов в окнах App я придумал решение, которое включает подкласс UIButton:

     - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { BOOL inside = [super pointInside: point withEvent: event]; if (inside && !self.isHighlighted && event.type == UIEventTypeTouches) { self.highlighted = YES; } return inside; } 

    Данный метод называется вызываемым, хотя touchhesBegan: называется задержкой. Проверка того, что вид находится в нижней части экрана, может быть подходящим для предотвращения возможных побочных эффектов с этим исправлением.

    ответ Лукаса в быстрой и отмените выделение

     extension UIButton { public override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { var inside = super.pointInside(point, withEvent: event) if inside != highlighted && event?.type == .Touches { highlighted = inside } return inside } } 

    Я написал полное решение в быстром, основанном на ответе Луки . Просто сделайте любые конфликтующие кнопки соответствующими этому классу, и проблема исчезнет:

     class BorderBugFixButton : UIButton { override func awakeFromNib() { super.awakeFromNib() NSNotificationCenter.defaultCenter().addObserver(self, selector: "unHighlight", name: UIApplicationWillResignActiveNotification, object: nil) } deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { let inside = super.pointInside(point, withEvent: event) if inside != highlighted && event?.type == .Touches { highlighted = inside } return inside } internal func unHighlight() { highlighted = false } } 

    PS: Для тех из вас, кто не любит Storyboards / Xib, просто перенесите реализацию awakeFromNib() на init()

    Решение Swift 3

     extension UIControl { open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { let inside = super.point(inside: point, with: event) if inside != isHighlighted && event?.type == .touches { isHighlighted = inside } return inside } } 

    Я столкнулся с этим много раз при работе с обновлением старых раскадровки до iOS 7+, обычно, когда рассматриваемый ViewController имеет форму UIScrollView. Дважды проверьте эти 2 настройки в своей раскадровке на объекте ViewController (не на представлении, а на желтом круге). Когда я снял флажок «Расширять края» в верхних и нижних барах, кадр scrollView был отрегулирован на 64 точки (высота баров Nav & Status).

    UIButton не работает в нижней части экрана После установки промежутка между NavBar.bottom и scrollView.top до 0, кнопка начала работать. Это может быть связано с тем, что scrollView.frame.bottom был на 64 пикселя выше нижней части окна, поэтому прикосновения в этой области игнорировались, потому что они были технически из кадра scrollView, но по какой-то причине визуально отображались визуально.

    iOS 9.3, Xcode 7.3

    Я бы предположил, что вы должны сделать категорию для класса UIButton, который реализует ответ Лукаса . Инструкции по созданию категории см. В этом сообщении: Как создать категорию в Xcode 6 или выше?

    Дайте ему соответствующее имя с традиционным знаком «+», т. Е. Если вы назовете его «BottomOfScreen», то получившееся имя файла будет «UIButton + BottomOfScreen».

    Если вы используете цель-c, то вы получите файлы * .h и * .m с новой категорией.

    *.час

     #import <UIKit/UIKit.h> @interface UIButton (BottomOfScreen) @end 

    * .m

     #import "UIButton+BottomOfScreen.h" @implementation UIButton (BottomOfScreen) - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { BOOL inside = [super pointInside:point withEvent:event]; if (inside && !self.isHighlighted && (event.type == UIEventTypeTouches)) { self.highlighted = true; } else { nil; } return inside; } @end 
    Interesting Posts

    Звук локального уведомления cordova не работает в ios и andorid

    есть ли защищенный метод?

    Как добавить значок в строку состояния iphone / ipod?

    Задержка между viewWillDisappear и viewDidDissapear

    Ввод текста в любое приложение «Повреждение текстового поля»

    Зарегистрируйтесь для изменения адресной книги, используя ABAddressBookRegisterExternalChangeCallback

    Как я могу заставить iOS сразу изменить цвет фона?

    Обнаруживать Roximity iBeacon без Roximity SDK?

    iOS: Есть ли какие-либо открытые Launcher Views, как домашний экран?

    Приложение IOS заканчивается ошибкой отладчика, просто (lldb)

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

    : обнаруживать, когда контроллер просмотра появляется после возврата из другого внешнего приложения

    Увеличение / уменьшение яркости UIImageView

    Фоновая выборка перестает работать примерно через 10-14 часов

    UISplitViewController: как представить главный вид в подробном представлении по событию кнопки, а не через жестовый саблей

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.