代码之家  ›  专栏  ›  技术社区  ›  Eyzuky

UIPickerView仅在iPad模拟器上被剪切在中间

  •  3
  • Eyzuky  · 技术社区  · 7 年前

    UIView 高度为1.0时,以及使用Autolayout附着在其上的选择器视图(显示在视图下方)。

    我的选取器视图的宽度应该与行分隔符(UIView)相等。

    在iPhone上,它工作得很好,但在iPad上,picker视图被切成了在中间部分。 我在“调试视图层次结构”中进行了测试,发现它实际上在视图的宽度中,但仍然在中间剪切(请参阅添加的屏幕截图)。

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let rowInfo = getRowText(for: pickerView, fromRow: row, andComponent: component)
    
        let field = (view as? UITextField) ?? UITextField()
        field.font = font16
        field.textAlignment = .left
        field.textColor = .black
        field.text = rowInfo.text
        return field
    }
    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        return self.aSeperator.frame.width
    }
    

    屏幕截图: On simulator

    on debug view hierarchy

    enter image description here

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   Eyzuky    7 年前

    发现问题! UIPickerView 从…起 viewDidLoad :

        clientPickerView.roundCorners([.bottomLeft, .bottomRight], radius: 4.0)
        clientSitePicker.roundCorners([.bottomLeft, .bottomRight], radius: 4.0)
    

    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
    

    解决方案是将此呼叫转移到 viewDidLayoutSubviews .