2016-03-12 2 views
1

Im строительный слайдер внутри UIAlertController, и он действительно отлично работал на iPhone, но дает ошибку ограничения связи на iPad, я дал предупреждение 140 высоты как ограничение перед представлением.Добавление представления в результат UIAlertController, нарушая ограничение на iPad

Вот мой код:

let alertController = UIAlertController(title:"Title", message: "", preferredStyle: UIAlertControllerStyle.Alert) 
let slider = UISlider(frame: CGRectMake(35, 50, 200, 20)) 
alertController.view.addSubview(slider) 

let height:NSLayoutConstraint = NSLayoutConstraint(item: alertController.view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 140) 
alertController.view.addConstraint(height); 

alertController.addAction(UIAlertAction(title: "close", style: UIAlertActionStyle.Cancel, handler: { (error) -> Void in 

})) 

self.presentViewController(alertController, animated: true, completion: nil) 

Ошибка:

Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7b555900 V:[_UIAlertControllerView:0x788d2a60'Title'(140)]>", 
    "<NSLayoutConstraint:0x789db3f0 V:[_UIAlertControllerView:0x788d2a60'Title'(1024)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x789db3f0 V:[_UIAlertControllerView:0x788d2a60'Title'(1024)]> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
+0

Сам по себе сам по себе - это почти так, как будто документация, которая гласит: «Должен использоваться AS-IS» - последнее слово. Единственное решение, которое работает на обеих платформах, \ n \ n \ n "в заголовке. –

ответ

0

Хорошо, у меня есть ответ, , но вы не собираетесь нравится.

Если вы выполните следующие действия (без добавления ограничений):

print("Alert frame" + String(alertController.view.frame)) 
self.presentViewController(alertController, animated: true, completion: nil) 

вы получите следующее:

Alert frame(0.0, 0.0, 768.0, 1024.0) 

Который только случается, ширина и высота IPad Air в портретном режиме , Хорошо, это, очевидно, не ширина и высота просмотров. Давайте немного изменим наш код.

self.presentViewController(alertController, animated: true) 
{ 
    print("Alert frame" + String(alertController.view.frame)) 
} 

На этот раз я получаю следующее:

Alert frame(0.0, 0.0, 300.0, 85.5) 

Пожалуйста, обратите внимание, что у меня есть два «\ п \ п» в моем названии. Итак, давайте ПРИНИМАЕМ, что они делают что-то фанковое до представления (помните, что Apple говорит, что это непрозрачный класс).

Так давайте добавим следующее:

self.presentViewController(alertController, animated: true) 
{ 
    let height:NSLayoutConstraint = NSLayoutConstraint(item: alertController.view, 
              attribute: NSLayoutAttribute.Height, 
              relatedBy: NSLayoutRelation.Equal, 
              toItem: nil, 
              attribute: NSLayoutAttribute.NotAnAttribute, 
              multiplier: 1, 
              constant: self.view.frame.height * 1.20) 
    alertController.view.addConstraint(height); 

}

Теперь, скрестить пальцы на удачу, и посмотреть, что происходит.

Unable to simultaneously satisfy constraints. 

Это говорит о том, что для меня Apple имеет ограничения на iPad, что это не на iPhone. Когда мы подбрасываем ограничение по высоте, мы установили ситуацию, когда внутренний код ограничения пытается решить две конфликтующие команды. Таким образом, он может сделать это только , нарушая ограничения.

Я использую .ActionSheet, но у меня такая же проблема. Похоже, что Apple не использует ограничения для iPhone. Если вы не создаете универсальное приложение, то все должно быть в порядке.

Однако, это важно, Apple может наложить ограничения на iPhone в будущем, что может привести к той же проблеме.

Суть заключается в следующем:

The UIAlertController class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified.

Для меня, Apple должна быть гораздо более явным и сказать: «Мы не поддерживаем модификации, вообще.» Я подозреваю, что они думают, что «как есть «Охватывает это, но, как вы, вероятно, видели (как и я), многие люди не проверяют все случаи.

Таким образом, я планирую искать версию третьей стороны, которая поддерживает как iPhone и IPad (см UIAlertController - add custom views to actionsheet -. Это аналогичная проблема

Тратить свое время на то, что может разорвать в промежуточном выпуске iOS не стоит.

+0

Я проверю это^_^ –

+0

Я регистрирую сообщение об ошибке, что документация Apple действительно нуждается в разъяснении, что должно быть не должно быть (как в нуле) att empts для изменения UIAlertController (подклассы или нет). Это включает, но не ограничивается, добавление ограничений и т. Д. –

+0

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

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