2016-11-18 12 views
4

コーナー半径とプレースホルダーの色と別のプロパティを制御するカスタムコードを持つUITextFieldがあります。また、任意のUI要素から影を落とすための拡張機能付きプロトコルがあります。UITextFieldのコーナー半径を大きくすると影が削除されます

問題は次のとおりです。テキストフィールドのコーナーの半径を大きくすると、影が失われます。角の半径が0である限り、私はまだ影があります。

そして、私はcornerRadiusを増やすと影を失ったときに、これは、デバッガで示しています。私は、影を落とすために実装ここ

setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key height 

は私のプロトコルである:

import UIKit 

protocol DropShadow {} 

extension DropShadow where Self: UIView { 

    func addDropShadow() { 
     layer.shadowColor = UIColor.black.cgColor 
     layer.shadowOpacity = 0.7 
     layer.shadowOffset = CGSize(width: 0, height: 4) 
     layer.shadowRadius = 3 
    } 
} 

そして、ここでは私のカスタムクラスでありますUITextFieldの場合:

import UIKit 

@IBDesignable 
class FancyTextField: UITextField, DropShadow { 

    @IBInspectable var cornerRadius: CGFloat = 0 { 
     didSet { 
      layer.cornerRadius = cornerRadius 
      layer.masksToBounds = cornerRadius > 0 
     } 
    } 

    @IBInspectable var borderWidth: CGFloat = 0 { 
     didSet { 
      layer.borderWidth = borderWidth 
     } 
    } 

    @IBInspectable var borderColor: UIColor? { 
     didSet { 
      layer.borderColor = borderColor?.cgColor 
     } 
    } 

    @IBInspectable var bgColor: UIColor? { 
     didSet { 
      backgroundColor = bgColor 
     } 
    } 

    @IBInspectable var placeHolderColor: UIColor? { 
     didSet { 
      let rawString = attributedPlaceholder?.string != nil ? attributedPlaceholder!.string : "" 
      let str = NSAttributedString(string: rawString, attributes: [NSForegroundColorAttributeName: placeHolderColor!]) 
      attributedPlaceholder = str 
     } 
    } 

} 

答えて

2

にコーナー半径を追加するとclipsToBoundsまたはmasksToBoundsをtrueに設定する必要があります。影が作成されるときに影が作成されることはありません外側境界です。

この問題の解決策として、あなたがクリップのコーナーを持っているUIViewsuperViewを作成する必要があります、そしてこのsuperViewに影を追加するには(クリアカラーにスーパーを設定してください)

+0

その何もありませんあなたのコードに間違いがあります。 'layer.masksToBounds = cornerRadius> 0'を変更するとコーナーの半径は削除されますが、影が追加されます。 私はあなたが 'UIView'を作成して影を追加し、コーナーの半径を追加するビューをサブビューとして追加する必要があると言いました。基本的に 'cornerRadius'コードを適用し、影を2つの別々のビューにドロップします。 – Rikh

+0

コミュニティが協力する場所、Rikhを手伝っていただきありがとうございます。それは有り難いです。 – MEnnabah

関連する問題