UITextField에서 Swift 추가 아이콘 / 이미지
UITextField에 아이콘 / 이미지를 추가하고 싶습니다. 아이콘 / 이미지는 자리 표시 자에게 맡겨야합니다.
나는 이것을 시도했다 :
var imageView = UIImageView();
var image = UIImage(named: "email.png");
imageView.image = image;
emailField.leftView = imageView;
감사.
추가 시도 emailField.leftViewMode = UITextFieldViewMode.Always
(기본값 leftViewMode
은 Never
)
Swift 4에 대한 업데이트 된 답변
emailField.leftViewMode = UITextFieldViewMode.always
emailField.leftViewMode = .always
Sahil은 훌륭한 답변을 가지고 있으며 개발자가 스토리 보드의 UITextFields에 이미지를 추가 할 수 있도록이를 @IBDesignable로 확장하고 싶었습니다.
스위프트 4.2
import UIKit
@IBDesignable
class DesignableUITextField: UITextField {
// Provides left padding for images
override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
var textRect = super.leftViewRect(forBounds: bounds)
textRect.origin.x += leftPadding
return textRect
}
@IBInspectable var leftImage: UIImage? {
didSet {
updateView()
}
}
@IBInspectable var leftPadding: CGFloat = 0
@IBInspectable var color: UIColor = UIColor.lightGray {
didSet {
updateView()
}
}
func updateView() {
if let image = leftImage {
leftViewMode = UITextField.ViewMode.always
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
imageView.contentMode = .scaleAspectFit
imageView.image = image
// Note: In order for your image to use the tint color, you have to select the image in the Assets.xcassets and change the "Render As" property to "Template Image".
imageView.tintColor = color
leftView = imageView
} else {
leftViewMode = UITextField.ViewMode.never
leftView = nil
}
// Placeholder text color
attributedPlaceholder = NSAttributedString(string: placeholder != nil ? placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: color])
}
}
여기서 무슨 일이 일어나고 있습니까?
이를 통해 다음을 수행 할 수 있습니다.
- 왼쪽에 이미지 설정
- UITextField의 왼쪽 가장자리와 이미지 사이에 패딩 추가
- 이미지와 자리 표시 자 텍스트가 일치하도록 색상 설정
노트
- 이미지 색상을 변경하려면 코드의 주석에있는 해당 메모를 따라야합니다.
- 스토리 보드에서 이미지 색상은 변경되지 않습니다. 시뮬레이터 / 장치에서 색상을 보려면 프로젝트를 실행해야합니다.
여기에 몇 가지 더 추가하고 싶습니다.
UITextField
왼쪽에 이미지를 추가 하려면 leftView
속성을 사용하십시오.UITextField
참고 : 음주 설정하는 것을 잊지 leftViewMode
에 UITextFieldViewMode.Always
와 권리 rightViewMode
에 대한 UITextFieldViewMode.Always and
기본값은UITextFieldViewModeNever
예를 들어
왼쪽에 이미지를 추가하려면
textField.leftViewMode = UITextFieldViewMode.Always
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
let image = UIImage(named: imageName)
imageView.image = image
textField.leftView = imageView
오른쪽에 이미지를 추가하려면
textField.rightViewMode = UITextFieldViewMode.Always
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
let image = UIImage(named: imageName)
imageView.image = image
textField.rightView = imageView
참고 :UITextField
왼쪽 또는 오른쪽에 이미지를 추가 할 때주의해야 할 사항이 있습니다 .
ImageView
추가 할 프레임을 지정 하는 것을 잊지 마십시오 .UITextField
let imageView = UIImageView (frame : CGRect (x : 0, y : 0, 너비 : 20, 높이 : 20))
이미지 배경이 흰색이면 이미지가 표시되지 않습니다.
UITextField
특정 위치에 이미지를 추가
ImageView
하려면의 하위보기 로 추가해야합니다UITextField
.
Swift 3.0 업데이트
@Mark Moeykens 그것을 아름답게 확장 하고 @IBDesignable로 만드십시오 .
나는 이것에 몇 가지 더 많은 기능을 수정하고 추가했습니다 (오른쪽 이미지에 하단 라인 및 패딩 추가).
참고 오른쪽에 이미지를 추가하려면 인터페이스 빌더에서 Force Right-to-Left
옵션을 선택할 수 있습니다 semantic
(그러나 오른쪽 이미지 패딩은 rightViewRect 메서드를 재정의 할 때까지 작동하지 않습니다).
나는 이것을 수정했고 여기에서 소스를 다운로드 할 수있다 ImageTextField
또 다른 방법은 이전 게시물에서 영감을 얻어 확장을 만듭니다.
이미지를 오른쪽 또는 왼쪽에 놓을 수 있습니다.
extension UITextField {
enum Direction {
case Left
case Right
}
// add image to textfield
func withImage(direction: Direction, image: UIImage, colorSeparator: UIColor, colorBorder: UIColor){
let mainView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 45))
mainView.layer.cornerRadius = 5
let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 45))
view.backgroundColor = .white
view.clipsToBounds = true
view.layer.cornerRadius = 5
view.layer.borderWidth = CGFloat(0.5)
view.layer.borderColor = colorBorder.cgColor
mainView.addSubview(view)
let imageView = UIImageView(image: image)
imageView.contentMode = .scaleAspectFit
imageView.frame = CGRect(x: 12.0, y: 10.0, width: 24.0, height: 24.0)
view.addSubview(imageView)
let seperatorView = UIView()
seperatorView.backgroundColor = colorSeparator
mainView.addSubview(seperatorView)
if(Direction.Left == direction){ // image left
seperatorView.frame = CGRect(x: 45, y: 0, width: 5, height: 45)
self.leftViewMode = .always
self.leftView = mainView
} else { // image right
seperatorView.frame = CGRect(x: 0, y: 0, width: 5, height: 45)
self.rightViewMode = .always
self.rightView = mainView
}
self.layer.borderColor = colorBorder.cgColor
self.layer.borderWidth = CGFloat(0.5)
self.layer.cornerRadius = 5
}
}
사용하다 :
if let myImage = UIImage(named: "my_image"){
textfield.withImage(direction: .Left, image: myImage, colorSeparator: UIColor.orange, colorBorder: UIColor.black)
}
즐겨 :)
Swift 3.0의 경우 textField 왼쪽에 이미지 추가
textField.leftView = UIImageView(image: "small-calendar")
textField.leftView?.frame = CGRect(x: 0, y: 5, width: 20 , height:20)
textField.leftViewMode = .always
패딩을 만들기 위해 컨테이너 뷰 내부에 이미지를 배치하는 것을 좋아합니다. 아이콘 배치에 만족하면 배경색을 제거 할 수 있습니다.
let imageView = UIImageView(frame: CGRect(x: 8.0, y: 8.0, width: 24.0, height: 24.0))
let image = UIImage(named: "my_icon")
imageView.image = image
imageView.contentMode = .scaleAspectFit
imageView.backgroundColor = UIColor.red
let view = UIView(frame: CGRect(x: 0, y: 0, width: 32, height: 40))
view.addSubview(imageView)
view.backgroundColor = .green
textField.leftViewMode = UITextFieldViewMode.always
textField.leftView = view
간단한 IBDesignable을 만들었습니다. 그러나 그것을 사용하십시오. UITextField가이 클래스를 확인하도록하십시오.
import UIKit
@IBDesignable
class RoundTextField : UITextField {
@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 leftImage : UIImage? {
didSet {
if let image = leftImage{
leftViewMode = .always
let imageView = UIImageView(frame: CGRect(x: 20, y: 0, width: 20, height: 20))
imageView.image = image
imageView.tintColor = tintColor
let view = UIView(frame : CGRect(x: 0, y: 0, width: 25, height: 20))
view.addSubview(imageView)
leftView = view
}else {
leftViewMode = .never
}
}
}
@IBInspectable var placeholderColor : UIColor? {
didSet {
let rawString = attributedPlaceholder?.string != nil ? attributedPlaceholder!.string : ""
let str = NSAttributedString(string: rawString, attributes: [NSForegroundColorAttributeName : placeholderColor!])
attributedPlaceholder = str
}
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: 50, dy: 5)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: 50, dy: 5)
}
}
자리 표시 자 아이콘을 설정하고 패딩을 TextField로 설정하는 또 다른 방법입니다.
let userIcon = UIImage(named: "ImageName")
setPaddingWithImage(image: userIcon, textField: txtUsername)
func setPaddingWithImage(image: UIImage, textField: UITextField){
let imageView = UIImageView(image: image)
imageView.contentMode = .scaleAspectFit
let view = UIView(frame: CGRect(x: 0, y: 0, width: 60, height: 50))
imageView.frame = CGRect(x: 13.0, y: 13.0, width: 24.0, height: 24.0)
//For Setting extra padding other than Icon.
let seperatorView = UIView(frame: CGRect(x: 50, y: 0, width: 10, height: 50))
seperatorview.backgroundColor = UIColor(red: 80/255, green: 89/255, blue: 94/255, alpha: 1)
view.addSubview(seperatorView)
textField.leftViewMode = .always
view.addSubview(imageView)
view.backgroundColor = .darkGray
textField.leftViewMode = UITextFieldViewMode.always
textField.leftView = view
}
스위프트 3.1
extension UITextField
{
enum Direction
{
case Left
case Right
}
func AddImage(direction:Direction,imageName:String,Frame:CGRect,backgroundColor:UIColor)
{
let View = UIView(frame: Frame)
View.backgroundColor = backgroundColor
let imageView = UIImageView(frame: Frame)
imageView.image = UIImage(named: imageName)
View.addSubview(imageView)
if Direction.Left == direction
{
self.leftViewMode = .always
self.leftView = View
}
else
{
self.rightViewMode = .always
self.rightView = View
}
}
}
가장 쉬운 방법을 선택하십시오. 대부분의 경우 멋진 글꼴 같은 아이콘을 추가하고 싶습니다 ... 글꼴 멋진 라이브러리를 사용하면 다음과 같이 텍스트 필드에 아이콘을 쉽게 추가 할 수 있습니다.
myTextField.setLeftViewFAIcon(icon: .FAPlus, leftViewMode: .always, textColor: .red, backgroundColor: .clear, size: nil)
이 빠른 라이브러리를 먼저 설치해야합니다 : https://github.com/Vaberer/Font-Awesome-Swift
이 함수를 전역 파일이나 클래스 위에 놓을 수 있으므로 전체 응용 프로그램에서 액세스 할 수 있습니다. 이 절차 후에 응용 프로그램의 요구 사항에 따라이 함수를 호출 할 수 있습니다.
func SetLeftSIDEImage(TextField: UITextField, ImageName: String){
let leftImageView = UIImageView()
leftImageView.contentMode = .scaleAspectFit
let leftView = UIView()
leftView.frame = CGRect(x: 20, y: 0, width: 30, height: 20)
leftImageView.frame = CGRect(x: 13, y: 0, width: 15, height: 20)
TextField.leftViewMode = .always
TextField.leftView = leftView
let image = UIImage(named: ImageName)?.withRenderingMode(.alwaysTemplate)
leftImageView.image = image
leftImageView.tintColor = UIColor(red: 106/255, green: 79/255, blue: 131/255, alpha: 1.0)
leftImageView.tintColorDidChange()
leftView.addSubview(leftImageView)
}
SetLeftSIDEImage(TextField: Your_textField, ImageName: “YourImageName”) // call function
이것은 Mark Moeykens의 답변을 수정 한 버전으로 이미지와 텍스트 사이에 패딩이 추가되고 누군가가 필요할 경우 이미지 크기를 조정할 수 있습니다.
스위프트 4
import UIKit
@IBDesignable
class TextFieldWithImage: UITextField {
override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
return super.leftViewRect(forBounds: bounds)
}
@IBInspectable var leftImage: UIImage? {
didSet {
updateView()
}
}
@IBInspectable var leftPadding: CGFloat = 0 {
didSet {
updateView()
}
}
@IBInspectable var rightPadding: CGFloat = 0 {
didSet {
updateView()
}
}
@IBInspectable var imageMaxHeight: CGFloat = 0 {
didSet {
updateView()
}
}
@IBInspectable var color: UIColor = UIColor.lightGray {
didSet {
updateView()
}
}
func updateView() {
if let image = leftImage {
leftViewMode = UITextField.ViewMode.always
let containerSize = calculateContainerViewSize(for: image)
let containerView = UIView(frame: CGRect(x: 0, y: 0, width: containerSize.width, height: containerSize.height))
let imageView = UIImageView(frame: .zero)
containerView.addSubview(imageView)
setImageViewConstraints(imageView, in: containerView)
setImageViewProperties(imageView, image: image)
leftView = containerView
} else {
leftViewMode = UITextField.ViewMode.never
leftView = nil
}
attributedPlaceholder = NSAttributedString(string: placeholder != nil ? placeholder! : "",
attributes: [NSAttributedString.Key.foregroundColor: color])
}
private func calculateContainerViewSize(for image: UIImage) -> CGSize {
let imageRatio = image.size.height / image.size.width
let adjustedImageMaxHeight = imageMaxHeight > self.frame.height ? self.frame.height : imageMaxHeight
var imageSize = CGSize()
if image.size.height > adjustedImageMaxHeight {
imageSize.height = adjustedImageMaxHeight
imageSize.width = imageSize.height / imageRatio
}
let paddingWidth = leftPadding + rightPadding
let containerSize = CGSize(width: imageSize.width + paddingWidth, height: imageSize.height)
return containerSize
}
private func setImageViewConstraints(_ imageView: UIImageView, in containerView: UIView) {
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
imageView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
imageView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -rightPadding).isActive = true
imageView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: leftPadding).isActive = true
}
private func setImageViewProperties(_ imageView: UIImageView, image: UIImage) {
imageView.contentMode = .scaleAspectFit
imageView.image = image
imageView.tintColor = color
}
}
스위프트 5
@IBOutlet weak var paswd: UITextField! {
didSet{
paswd.setLeftView(image: UIImage.init(named: "password")!)
paswd.tintColor = .darkGray
paswd.isSecureTextEntry = true
}
}
확장 프로그램을 만들었습니다.
extension UITextField {
func setLeftView(image: UIImage) {
let iconView = UIImageView(frame: CGRect(x: 10, y: 10, width: 25, height: 25)) // set your Own size
iconView.image = image
let iconContainerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: 45))
iconContainerView.addSubview(iconView)
leftView = iconContainerView
leftViewMode = .always
self.tintColor = .lightGray
}
}
결과
스위프트 5
@Markus와 비슷하지만 Swift 5에서 :
emailTextField.leftViewMode = UITextField.ViewMode.always
emailTextField.leftViewMode = .always
SwiftUI
RoundedRectangle(cornerRadius: 50)
.frame(height: 40)
.colorInvert() // sets the background white
.padding()
.shadow(radius: 12) // adds shadow to the rectangle
.overlay(
HStack(spacing: 20){
Image(systemName: "person")
.resizable()
.aspectRatio(contentMode: .fit)
TextField("Username ", text: $username)
.font(Font.custom("Arial", size: 25))
.font(.title)
}
.padding()
.padding()
)
참고 URL : https://stackoverflow.com/questions/27903500/swift-add-icon-image-in-uitextfield
'programing tip' 카테고리의 다른 글
FormData에 배열을 추가하고 AJAX를 통해 전송 (0) | 2020.09.20 |
---|---|
Python3 : ImportError : 모듈 다중 처리의 값을 사용할 때 '_ctypes'라는 모듈이 없습니다. (0) | 2020.09.20 |
git 저장소의 .pyc 파일 무시 (0) | 2020.09.20 |
SQL 쿼리-UNION에서 Order By 사용 (0) | 2020.09.20 |
HTTP Get으로 배열 보내기 (0) | 2020.09.20 |