设备方向更改后重新绘制自定义UIVIEW SWIFT 5

时间:2020-07-11 23:29:32

标签: swift

我为新的UIVIEW写下了代码,但是在设备旋转后,UIVIEW的绘制没有针对新情况进行清理!并保持对用户可见!看图片。我们如何解决该问题?

导入UIKit

class ViewController: UIViewController
{
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
    }
    

    override func viewDidLayoutSubviews()
    {

        var drawView = UIView()

        let drawViewOffsetFromTop = max( 25 , Int( view.safeAreaInsets.top ) )
        let drawViewOffsetFromBottom = max( 25 , Int( view.safeAreaInsets.bottom ) )
        
        let drawViewWidth = Int( view.frame.size.width ) - 2*25
        let drawViewHeight = Int( view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom

        drawView = UIView(frame: CGRect(x: 25 , y: drawViewOffsetFromTop, width: drawViewWidth  , height: drawViewHeight ))
        drawView.backgroundColor = UIColor.gray
        drawView.layer.cornerRadius = 15
        view.addSubview(drawView)
   
    }
    
    
}

enter image description here

3 个答案:

答案 0 :(得分:0)

您可以使用自动版式使事情变得简单。
完全删除覆盖viewDidLayoutSubviews

viewDidLoad

中使用以下内容
override func viewDidLoad()
{
    super.viewDidLoad()
    var drawView = UIView()

    //Setup Constraints for `drawView`
    drawView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        drawView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 25),
        drawView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -25),
        drawView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 15),
        drawView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -15)
    ])

}

编辑:无自动版式的解决方案
问题是您的drawView已在视图层次结构中多次添加!您只需添加一次即可,仅更改框架。

class ViewController: UIViewController {
        
    var drawView = UIView()

    override func viewDidLoad()
    {
        super.viewDidLoad()
        view.addSubview(drawView)
        drawView.backgroundColor = UIColor.gray
        drawView.layer.cornerRadius = 15
    }


    override func viewDidLayoutSubviews()
    {


        let drawViewOffsetFromTop = max( 25 , Int( view.safeAreaInsets.top ) )
        let drawViewOffsetFromBottom = max( 25 , Int( view.safeAreaInsets.bottom ) )
        
        let drawViewWidth = Int( view.frame.size.width ) - 2*25
        let drawViewHeight = Int( view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom
        
        drawView.frame = CGRect(x: 25 , y: drawViewOffsetFromTop, width: drawViewWidth  , height: drawViewHeight )

    }
}

答案 1 :(得分:0)

首先,您应该将创建UIView代码放在viewDidLayoutSubviews中,而是将其创建并添加到viewDidLoad中。您可以在viewDidLayoutSubviews中放入视框更新代码。

问题是您要多次添加drawView而不会删除现有的drawView。另外,您不必要在不同的行中多次初始化drawView

要解决此问题,请在控制器中创建viewDidLoad,将其添加到viewDidLayoutSubviews的超级视图中,然后像以下所示编辑class ViewController: UIViewController { private var drawView : UIView = UIView() override func viewDidLoad() { super.viewDidLoad() view.addSubview(drawView) } override func viewDidLayoutSubviews() { let drawViewOffsetFromTop = max(25 , Int(view.safeAreaInsets.top)) let drawViewOffsetFromBottom = max(25 , Int(view.safeAreaInsets.bottom)) let drawViewWidth = Int(view.frame.size.width ) - 2*25 let drawViewHeight = Int(view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom drawView.frame = CGRect(x: 25, y: drawViewOffsetFromTop, width: drawViewWidth, height: drawViewHeight) drawView.backgroundColor = UIColor.gray drawView.layer.cornerRadius = 15 } }

{{1}}

答案 2 :(得分:0)

create or replace TRIGGER EVAL_CHANGE_TRIGGER
  AFTER INSERT OR UPDATE OR DELETE
  REFERENCING NEW AS NEW OLD AS OLD
  ON ResearchTable
DECLARE
  log_action  varchar(10);
  p_xmldata     XMLtype;
  p_newrowdata    clob;
BEGIN
    select XMLElement("ResearchTable", 
                   XMLElement("myColumn1", :NEW.myColumn1),
                   XMLElement("myColumn2", :NEW.myColumn2),
                   ....)
                   into p_xmldata from dual;
                   
   p_newrowdata:=p_xmldata.getClobVal();  
  
  IF INSERTING THEN
    log_action := 'Insert';
  ELSIF UPDATING THEN
    log_action := 'Update';
  ELSIF DELETING THEN
    log_action := 'Delete';
  ELSE
    DBMS_OUTPUT.PUT_LINE('This code is not reachable.');
  END IF;

 INSERT INTO auditsResearch (table_name, transaction_name, by_user, transaction_date,XMLDATA)
   VALUES('PROJ_TEST', log_action, USER, SYSDATE,p_newrowdata);
END;