iOS中容易用錯的常用知識點

2023-05-31 18:03:22
座標系轉換
ios中的座標系有三種
檢視座標系:原點(0,0)檢視的左上角
視窗座標系:原點(0,0)視窗的左上角
世界座標系:原點(0,0)遊戲中世界的原點

平時開發中經常會遇到轉UIWindow座標問題,如:已知一個UI控制元件的座標,把它轉換到UIWindow時,它對應的UIWindow座標是什麼?
蘋果提供了一套相關的轉換方法,但是它缺少了座標在轉換時會涉及到三個UIView, 方法中沒有對這3個UIView關係的描述,這在使用座標轉換時就很容易搞迷糊了。
open func point(inside point: CGPoint, with event: UIEvent?) -> Bool

open func convert(_ point: CGPoint, to view: UIView?) -> CGPoint

open func convert(_ point: CGPoint, from view: UIView?) -> CGPoint

open func convert(_ rect: CGRect, to view: UIView?) -> CGRect

open func convert(_ rect: CGRect, from view: UIView?) -> CGRect
舉例如下:
override func viewDidLoad() {
    super.viewDidLoad()
    
    view.addSubview(myButton)
    
    let center2 = view.convert(myButton.center, to: UIApplication.shared.keyWindow)
}
下面這件程式碼的意思是將self.view下面的子檢視self.myButton的中點從它的檢視座標系中轉換到keyWindow的視窗座標系中時,得到的座標是什麼。
這句程式碼種涉及到的三個UIView: self.view, self.myButton, keyWindow。其中self.myButton是self.view的子檢視。這層關係需要清楚,就避免迷糊了。
view.convert(myButton.center, to: UIApplication.shared.keyWindow)

 

自定義UIButton中Image和title的位置關係
UIButton中Image和title的位置座標是可以自定義調整的,弄懂了下面這些就不用經常在UIView裡套Image和Label來自定義檢視了。

前置條件
手寫UIButton時,ButtonType選擇custom,style設定為Default(這個沒有找到設定的地方,在xib上有這項,實際上手動建立的程式碼style預設就是Default)
使用xib建立的UIButton時,把它的plain改成Default。ButtonType設定成custom。
就是截圖中的上面2項:
已知概念
1.UIButton中的image和image現在預設是上下,左右居中,並且image和title在水平方向是挨著的。
btn.contentEdgeInsets = .zero
btn.imageEdgeInsets = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 25)
btn.titleEdgeInsets = UIEdgeInsets(top: 2, left: 12, bottom: 2, right: 2)
2.上面btn相關的EdgeInset值的設定的效果 是和css中的padding內邊距效果一致的。即:值>0內容向內縮,值<0內容往外擴充套件。
3.image和title具有中間挨著的特性,預設情況下,無論image左移多少,title都會跟隨左移多少,以滿足image和title中間挨著的特性。
4.對於設定的EdgeInset中的偏移量是相對於image和title在沒有設定任何偏移量時的預設狀態的偏移。

瞭解了上面這些概念就可以愉快的自定義UIButton中image和lable的位置了。
let btn = UIButton(type: .custom)
btn.frame = CGRect(x: 100, y: 80, width: 40, height: 20)
btn.setTitleColor(.white, for: .normal)
btn.setTitle("jack", for: .normal)
btn.titleLabel?.font = UIFont.systemFont(ofSize: 10)
btn.setImage(UIImage.init(named: "loveHeat"), for: .normal)
btn.backgroundColor = UIColor.black.withAlphaComponent(0.6)
btn.layer.cornerRadius = 4;
btn.layer.masksToBounds = true;
btn.imageEdgeInsets = UIEdgeInsets(top: 3, left: 2, bottom: 1, right: 25)
btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: 1, bottom: 0, right: 0)
btn.isUserInteractionEnabled = false