เปลี่ยน UITextField และ UITextView Cursor / Caret Color


222

ฉันสงสัยเกี่ยวกับการเปลี่ยนสีของเคอร์เซอร์ / คาเร็ตในUITextField(และUITextViewถ้าเป็นคำตอบเดียวกัน) ใน iOS ฉันเห็นคำตอบสำหรับการพัฒนา OSX แต่ไม่มีอะไรสำหรับ iOS

เป็นไปได้ไหม


1
คำตอบโดยละเอียดสำหรับUITextFieldรวมถึงวิธีการทำเช่นนี้ในเครื่องมือสร้างส่วนติดต่อที่stackoverflow.com/a/18759577/1709587
Mark Amery

1
คำตอบที่ง่ายและสมบูรณ์ที่stackoverflow.com/a/18945907/1292230 ;)
RileyE

คำตอบ:


513

หากคุณกำหนดเป้าหมายเป็น iOS 7+ สิ่งนี้จะทำให้ง่ายขึ้น เพียงแค่เปลี่ยนtintColorเขตข้อมูลด้วยเคอร์เซอร์โดยใช้ลักษณะที่ปรากฏของพร็อกซีและจะมีผลกับแอพ:

สวิฟท์ 3.0:

UITextField.appearance().tintColor = .black 

Objective-C:

[[UITextField appearance] setTintColor:[UIColor blackColor]];

คำตอบเดียวกันใช้สำหรับบุคคลUITextField:

สวิฟท์ 3.0:

myTextField.tintColor = .black 

Objective-C

[myTextField setTintColor:[UIColor blackColor]];

13
ฉันพบว่าสิ่งนี้ทำให้ UIBarButton สีอ่อนของรายการของฉันกลายเป็นค่าเริ่มต้นถึงแม้ว่าฉันจะตั้งค่าสีอ่อนไปเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง ฉันแก้ไขปัญหาด้วยการตั้งค่าสีอ่อนของ UITextFields แยกต่างหากเมื่อสร้างขึ้น
willtalmadge

สิ่งนี้ใช้ได้ผล แต่ถ้าคุณทำในการทำเสร็จสิ้นการเปิดตัวแล้ว หรือคุณสามารถทำได้ตามการโต้ตอบของผู้ใช้เช่นกดปุ่ม?
Steffen Andersen

@SteffenAndersen ควรทำงานตามเอกสาร API พร็อกซี UIAppearance
DiscDev

[[ลักษณะที่ปรากฏ UITextView] setTintColor: teal]; ด้วยเหตุผลบางอย่างนี้เปลี่ยนสีปุ่มนำทางของฉันคุณตั้งค่าแยกกันอย่างไร?
จอห์น

3
ใน Swift 3.0 ใช้สิ่งนี้: UITextField.appearance (). tintColor = UIColor.black
Lucas Torquato



13

หมายเหตุ: คำตอบนี้ล้าสมัยและควรใช้สำหรับการพัฒนา pre-iOS 7 เท่านั้น ดูคำตอบอื่น ๆ สำหรับวิธีแก้ปัญหา 1 บรรทัดโดยใช้ proxy ลักษณะที่ปรากฏใน iOS 7

ฉันมาถึงคำถามนี้หลังจากที่ฉันประสบปัญหาเดียวกันในโครงการที่ฉันทำงานอยู่

ฉันจัดการเพื่อสร้างโซลูชันที่ทีมตรวจสอบ AppStore จะยอมรับเพราะไม่ได้ใช้ API ส่วนตัวที่มีอยู่

ฉันได้สร้างตัวควบคุมที่เรียกว่า DGTextField ที่ขยาย UITextField


มันเยี่ยมมาก จริงๆแล้วด้วยเหตุนี้ฉันจะจับตาดู "Conforms to" ในเอกสารอย่างแน่นอน อย่างไรก็ตามฉันดีใจที่มีเพียงคนเดียวเท่านั้นที่ต้องใช้เวลาอ่านและแก้ไขปัญหานี้ หวังว่าคนอื่นจะสามารถเห็นและใช้สิ่งนี้!
RileyE

อย่างไรก็ตามฉันอาจแนะนำตัวเลือกภาพเคลื่อนไหวโดยลบ @propery และเพิ่งสร้าง setters และ getters รวมถึง setter และ getter สำหรับความกว้างคาเร็ตที่กำหนดเอง คุณอาจไม่สนใจ แต่ฉันรักการปรับแต่งเล็กน้อย!
RileyE

@RileyE ฉันดีใจที่คุณได้รับประโยชน์จากโซลูชันของฉัน อย่าลังเลที่จะแยก repo และเพิ่ม tweaks ใด ๆ ที่คุณต้องการแบ่งปัน
Dov

3
ง่ายกว่าใน iOS 7 - ดูคำตอบของฉันด้านล่าง: stackoverflow.com/a/18945907/1103584
DiscDev

12
yourTextField.tintColor = [UIColor whiteColor];

มันใช้งานได้ถ้าคุณตั้งเป็นรหัส 'เพราะตัวเรียกสีไม่ทำงานในเครื่องมือสร้างส่วนติดต่อ (Xcode 6.1.1) มันเหมาะสมดีโดยไม่จำเป็นต้องเปลี่ยนพร็อกซีลักษณะใด ๆ


2
ด้วยเหตุผลที่ไม่ทราบสาเหตุบางอย่างมันไม่ได้ผลกับฉันด้วย whiteColor แต่ใช้ได้กับทุกสีอื่น ๆ ฉันต้องตั้งค่าสีที่เกือบจะเป็นสีขาว แต่ไม่ใช่สีขาวเพื่อให้ใช้งานได้
Leszek Szary

@LeszekSzary เฮ้! คุณบันทึกวันของฉัน! ฉันพยายามเกือบ 4 ชั่วโมงและคำพูดของคุณเป็นเบาะแส! Apple ควรแก้ไขข้อผิดพลาดบ้าคลั่งนี้ซึ่งทำให้นักพัฒนาบ้าคลั่งอย่างแท้จริง
Karthick Ramesh

10

การตั้งค่าtintColorสำหรับUITextFieldการUITextViewทำงานแตกต่างกัน ในขณะที่UITextFieldคุณไม่จำเป็นต้องเรียกรหัสเพิ่มเติมหลังจากการปรับปรุงtintColorเพื่อเปลี่ยนสีเคอร์เซอร์ แต่สำหรับUITextViewคุณ

ดังนั้นหลังจากการตั้งค่าtintColorสำหรับUITextView(มันไม่ได้เรื่องใน IB หรือในรหัส) คุณต้องโทรtextView.tintColorDidChange()ในการสั่งซื้อที่จะใช้มัน (จริงๆแล้วมันจะผ่านการตั้งค่ามุมมองข้อความลงไปลำดับชั้น subviews ของมัน)


5

สิ่งนี้ใช้ได้กับฉันอย่างรวดเร็ว:

UITextField.tintColor = UIColor.blackColor()

คุณสามารถตั้งค่านี้ในกระดานเรื่องราว: https://stackoverflow.com/a/18759577/3075340


มันใช้งานไม่ได้ ฉันได้รับข้อผิดพลาด:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros

@pableiros ด้านบนเป็นของ Swift 2 บางทีตอนนี้คุณกำลังใช้ Swift 3 อยู่หรือเปล่า?
Micro

ฉันลองใช้ Swift 3 และ Swift 2.3 ฉันไม่แน่ใจว่าใน Swift 2.2 หรือต่ำกว่าใช้งานได้หรือไม่
pableiros

3

วิธีการทั่วไปที่มากกว่านั้นก็คือการตั้งค่า tintColor ของ UIView

UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];

เหมาะสมถ้าคุณใช้องค์ประกอบ UI เริ่มต้นมากมาย


2
อืม ... นี่มีผลข้างเคียงอื่น ๆ อีกมากมาย ... คำถามนี้ถามเพียงเกี่ยวกับการเปลี่ยนสีของคาเร็ตและคำตอบของคุณจะแต้มสี UIView ทุกอันในแอป ... นี่อาจไม่ใช่วิธีที่คนส่วนใหญ่ต้องการ ที่จะใช้.
DiscDev

+1 ว่ามีผลข้างเคียงมากเกินไปหากเป้าหมายเพียงเพื่อเปลี่ยนสีเครื่องหมายรูปหมวก การตั้งค่า UIView tintColor จะมีประโยชน์เมื่อคุณใส่สไตล์คอนเทนเนอร์ (แต่ฉันจะไม่ใช้[UIView appearance]
colinta

2

ลองใช้งานได้สำหรับฉัน

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];

6
ใช้วิธีการส่วนตัว แต่ขอบคุณสำหรับคำแนะนำ วิธีนี้สามารถทำให้แอปพลิเคชันถูกปฏิเสธได้อย่างง่ายดาย
RileyE


0

วิธีการของ Durgesh ทำงาน

ฉันยังใช้โซลูชั่น KVC ดังกล่าวหลายครั้ง แม้จะดูเหมือนว่าจะไม่มีเอกสาร แต่ก็ใช้งานได้ ตรงไปตรงมาคุณไม่ได้ใช้วิธีการส่วนตัวใด ๆ ที่นี่ - เฉพาะการเข้ารหัสคีย์ - ค่าซึ่งถูกกฎหมาย

ป.ล. เมื่อวานนี้แอปใหม่ของฉันปรากฏที่ AppStore โดยไม่มีปัญหากับวิธีการนี้ และมันไม่ใช่กรณีแรกเมื่อฉันใช้ KVC ในการเปลี่ยนคุณสมบัติแบบอ่านอย่างเดียว (เช่น navigatonBar) หรือ ivars ส่วนตัว


1
มันไม่ได้ใช้วิธีการแบบส่วนตัว แต่เป็นปุ่มที่ไม่มีเอกสารซึ่งหมายความว่าไม่ควรใช้กับแอปพลิเคชันใน App Store ใบสมัครของคุณอาจถูกปฏิเสธ คุณต้องมีผู้ตรวจทานที่ใจดีเนื่องจากหลายคนถูกปฏิเสธเนื่องจากใช้วิธีการนี้
RileyE

ฉันมีผู้ตรวจสอบที่ใจดีประมาณ 10 คน :) และเพื่อนร่วมงานจำนวนมากของฉันด้วย
malex

1
เพียงเพื่อชี้แจง "การเข้ารหัสคีย์ - ค่า" ในกรณีนี้กำลังกำหนดค่าให้กับคุณสมบัติโดยใช้วิธีการอำนวยความสะดวก เหตุผลที่เราใช้สิ่งนั้นกับ setter นั้นเป็นเพราะคุณสมบัติไม่สามารถเข้าถึงได้ / ซ่อน / ส่วนตัว
RileyE

1
ที่นี่ฉันหมายถึง (บางทีฉันไม่รู้สิ่งสำคัญ) เฉพาะเอกสารของ KVC ที่ไม่ได้บ่งบอกถึงข้อ จำกัด อย่างแท้จริง ดังนั้นฉันจึงใช้สิ่งเหล่านี้ได้สำเร็จ และหวังว่าคนอื่นจะทำได้
malex

1
ชื่นชม อย่างไรก็ตาม Apple ใน 'ข้อตกลงการใช้งาน' ระบุว่าเราได้รับอนุญาตให้ใช้และพูดคุยอย่างเปิดเผยสิ่งใด ๆ ที่รวมอยู่ในเอกสารประกอบของพวกเขาและห้ามการใช้วิธีการที่ไม่มีเอกสาร (การเข้าถึงวิธีการตั้งค่า 'textInputTraits' ไม่มีการบันทึกคุณสมบัติ) โดยพื้นฐานแล้วหากคุณไม่สามารถหาวิธีในเอกสารได้ แม้ว่าจะมีการห้ามไม่รับประกันการปฏิเสธ ฉันมีบางแอพพลิเคชั่นถูกปฏิเสธด้วยเหตุผลที่รวมอยู่ในแอพของฉันบางตัวที่ส่งไปที่ร้าน มันได้รับความนิยมและพลาดด้วยวิธีการที่ไม่มีเอกสาร
RileyE

0

สำหรับรุ่นเครื่องมือสร้างส่วนต่อประสานที่มี Swift

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }

0

ถ้าUITextFieldเป็นจากUISearchBarนั้นก่อนได้รับtextFieldจากsearchBarและจากนั้นใช้tintColorคุณสมบัติ:

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray

0

สวิฟต์ 4

ใน viewDidLoad () เพียงแค่เรียกรหัสด้านล่าง:

ตัวอย่างโค้ด

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

ฉันคิดว่าถ้าคุณต้องการสีที่กำหนดเองคุณสามารถไปที่Assets.xcassetsโฟลเดอร์คลิกขวาและเลือกNew Color Setเมื่อคุณสร้างสีที่คุณตั้งไว้ให้ตั้งชื่อเพื่อใช้ซ้ำ

และคุณสามารถใช้มันได้เช่นนี้

import UIKit 

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME")  #here
    }
}

ทดสอบบน macOS 10.15 / iOS 13 / Swift 5


0

สำหรับผู้ที่ค้นหาสิ่งที่เทียบเท่าใน SwiftUI สำหรับTextfieldสิ่งนี้คือaccentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.