纵向/横向显示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 显示像横向

尝试在 iOS 8 中以横向模式而不是纵向模式显示键盘

滚动条在 IOS APP 中未以横向模式显示

带有纵向和横向图像的 UIBarButtonItem 可能会显示横向的纵向图像

当设备倾斜到横向时,iOS应用程序崩溃

iPad 1 显示纵向模式而不是横向模式