纵向/横向显示ios swift 3
Posted
技术标签:
【中文标题】纵向/横向显示ios swift 3【英文标题】:Portrait/Landscape display ios swift 3 【发布时间】:2017-05-10 00:33:10 【问题描述】:我有一个有 2 个视图的应用程序。
在第一个视图中,用户输入登录信息,点击搜索按钮。
应用程序通过 api 检索有关登录的信息, 在显示有关登录信息的第二个视图上重定向。第二个视图上有一个后退按钮,可以返回第一个视图,以便能够搜索不同的登录名
在第二个视图中,我处理这两种情况(横向/纵向) 发生的情况如下:我第一次进入登录时,纵向和横向案例在结果视图中得到了很好的处理。
当我回去搜索新的登录时,它只会显示你第二次进入的模式(如果你以竖屏模式进入,它会 仅在纵向模式下显示,与横向相同)我应该做些什么吗?
这是第一个视图的代码:
var login = ""
类 FirstViewController: UIViewController
@IBOutlet weak var Input: UITextField!
@IBAction func sendlogin(_ sender: UIButton)
if let text = Input.text, !text.isEmpty
login = text
performSegue(withIdentifier: "callaffiche", sender: self)
return
else
return
这里是第二个视图的代码(我只会发布viewDidLoad,沿着它的功能创建后退按钮和创建imageuser,因为有很多对象。但它们都是用相同的原理创建的)AfficheElemts调用每个对象的创建(ButtonBackAffiche、ImageAffiche 在 AfficheElements 中调用
override func viewDidLoad()
super.viewDidLoad()
print("ds viewdidload")
let qos = DispatchQoS.userInitiated.qosClass
let queue = DispatchQueue.global(qos: qos)
queue.sync
self.aut.GetToken(completionHandler: (hasSucceed) in
if hasSucceed
print("good")
DispatchQueue.main.async
self.AfficheElements()
else
print("bad")
)
func ButtonBackAffiche ()
let button = UIButton()
button.restorationIdentifier = "ReturnToSearch"
button.setTitle("Back", for: .normal)
button.setTitleColor(UIColor.black, for: .normal)
button.isEnabled = true
button.addTarget(self, action: #selector(ReturnToSearch(button:)), for: .touchUpInside)
if UIDevice.current.orientation.isPortrait
button.frame = CGRect (x:CGFloat(180),y:CGFloat(600),width:50,height:30)
else
button.frame = CGRect (x:CGFloat(350),y:CGFloat(360),width:50,height:30)
self.view.addSubview(button)
func ImageAffiche ()
//Get image (Data) from URL Internet
let strurl = NSURL(string: image_url)!
let dtinternet = NSData(contentsOf:strurl as URL)!
let bongtuyet:UIImageView = UIImageView ()
if UIDevice.current.orientation.isPortrait
print("portrait ds imageview")
bongtuyet.frame = CGRect (x:10,y:80,width:30,height:30)
else
print("landscape ds imageview")
bongtuyet.frame = CGRect (x:CGFloat(200),y:CGFloat(80),width:90,height:120)
bongtuyet.image = UIImage(data:dtinternet as Data)
self.view.addSubview(bongtuyet)
func ReturnToSearch(button: UIButton)
performSegue(withIdentifier: "ReturnToSearch", sender: self)
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
print("ds viewwilltransition")
if UIDevice.current.orientation.isPortrait
print("portrait")
else
print("landscape")
while let subview = self.view.subviews.last
subview.removeFromSuperview()
AfficheElements()
最后一件事,我在代码中添加了跟踪和对象的创建,它通过了代码的正确部分,但没有在正确的位置显示对象。
【问题讨论】:
您是否在 ViewControllers 中覆盖 shouldAutorotate 和 supportedInterfaceOrientations? 不,我没有。我只使用 viewDidLoad 来获取 json 数据并第一次显示元素,并使用 viewWillTransition 来擦除元素,如果设备旋转则重新显示它们 还有一件事,在调查了更多之后,发生的情况是它删除了对象,然后重新显示它们,但视图显示似乎没有更新。我需要进行刷新或类似的操作吗? 为什么要删除和添加控件?为什么不通过设置 autoresizemask 或约束来移动它们。 @Spads 我对 io swift 很陌生。这对我来说是最简单的方法。我删除所有对象并重新绘制它们。我进步了一点。发生的情况是视图没有刷新。我通过在 viewWillTransition 中添加以下行来使其工作: UIApplication.shared.keyWindow?.rootViewController = storyboard!.instantiateViewController(withIdentifier: "thirdVC") 重新实例化整个视图。刷新显示的命令是什么。我好像没找到。 【参考方案1】:感谢@Spads 花时间帮助我。 我终于弄明白了。我没有调用函数 AfficheElements 进入主队列。
DispatchQueue.main.async
self.AfficheElements()
在 viewWillTransition 中解决了它。
【讨论】:
以上是关于纵向/横向显示ios swift 3的主要内容,如果未能解决你的问题,请参考以下文章
IOS4 UISplitViewController 在纵向与 RootViewController 显示像横向