गोल खंड पाठ क्षेत्र को पसंद करने के लिए UITextview शैली कैसे करें?


170

मैं एक टिप्पणी संगीतकार के रूप में एक पाठ दृश्य का उपयोग कर रहा हूं।

प्रॉपर्टी इंस्पेक्टर में मुझे बॉर्डर स्टाइल प्रॉपर्टी जैसी कोई चीज नहीं मिल रही है, ताकि मैं एक राउंडेड रेक्ट का इस्तेमाल कर सकूं, जैसे कुछ UITextField

तो, सवाल यह है: मैं एक शैली दे सकते हैं कैसे UITextViewएक तरह UITextFieldएक गोल रेक्ट साथ?


1
क्या आप उपयोग नहीं कर सकते UITextFieldऔर बस बंद कर सकते हैं userInteractionEnabled?
jowie

जवाबों:


285

कोई अंतर्निहित शैली नहीं है जिसे आपको चुनना है, इसमें QuartzCoreफ्रेमवर्क का उपयोग करके थोड़ा सा कोड लिखना शामिल है:

//first, you
#import <QuartzCore/QuartzCore.h>

//.....

//Here I add a UITextView in code, it will work if it's added in IB too
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 220, 200, 100)];

//To make the border look very close to a UITextField
[textView.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor]];
[textView.layer setBorderWidth:2.0];

//The rounded corner part, where you specify your view's corner radius:
textView.layer.cornerRadius = 5;
textView.clipsToBounds = YES;

यह केवल OS 3.0 और इसके बाद के संस्करण पर काम करता है, लेकिन मुझे लगता है कि अब यह वैसे भी एक वास्तविक मंच है।


47
मैंने निम्नलिखित शीर्ष को जोड़ते हुए पाया कि उपरोक्त कोड सीमा को एक UITextField के बहुत करीब दिखता है। [textView.layer setBorderColor: [[[UIColor GreyColor] colorWithAlphaComponent: 0.5] CGColor]]; [textView.layer setBorderWidth: 2.0];
रोब

12
यह सुनिश्चित करें: #import <QuartzCore / QuartzCore.h>। मैं समस्या नहीं थी क्योंकि मैं QuartzCore आयात नहीं किया
ऑस्टेन

1
मेरे जैसे n00bs के लिए, ध्यान देने योग्य: इस कोड को viewDidLoad में नहीं डालें initWithNibName :-)
ब्रायन Colavito

1
आप बस सेट UITextFieldकी गई borderStyleसंपत्ति के साथ उपयोग कर सकते हैं UITextBorderStyleRoundedRect- नीचे मेरी पोस्ट देखें।
jowie

5
iOS 7 - 1.0 का बॉर्डरवाइट और .2 का अल्फा डिफॉल्ट स्टाइल के साथ काम करता है।
कालेल वेड

77

इस कोड ने मेरे लिए अच्छा काम किया:

    [yourTextView.layer setBackgroundColor: [[UIColor whiteColor] CGColor]];
    [yourTextView.layer setBorderColor: [[UIColor grayColor] CGColor]];
    [yourTextView.layer setBorderWidth: 1.0];
    [yourTextView.layer setCornerRadius:8.0f];
    [yourTextView.layer setMasksToBounds:YES];

4
मैं कहूंगा कि 5px पाठ फ़ील्ड के करीब है, लेकिन इस उत्तर का ग्रे रंग चयनित उत्तर से बेहतर है।
पीटर देवेसे

2
निश्चित रूप से आपको इस उत्तर के लिए क्वार्ट्जकोर फ्रेमवर्क को जोड़ने और #import <QuartzCore / QuartzCore.h> द्वारा आयात करने की आवश्यकता है
lukaswelte

36

स्विफ्ट 3 संस्करण

इंटरफ़ेस बिल्डर में पाठ दृश्य सेट करने के बाद।

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    textView.layer.cornerRadius = 5     
    textView.layer.borderColor = UIColor.gray.withAlphaComponent(0.5).cgColor
    textView.layer.borderWidth = 0.5  
    textView.clipsToBounds = true
}

स्विफ्ट 2.2 संस्करण

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    textView.layer.cornerRadius = 5     
    textView.layer.borderColor = UIColor.grayColor().colorWithAlphaComponent(0.5).CGColor
    textView.layer.borderWidth = 0.5  
    textView.clipsToBounds = true
}

1
समस्या यह है कि यह बिल्कुल ग्रे नहीं है। UITextField के फ्रेम का रंग थोड़ा अलग है।
मकाले

1
बनाना .borderWidth = 0.7 यह आईओएस 11 पर दिखने वाली वर्तमान शैली के करीब दिखता है।
क्रिस एमेलिंक्स

28

संपादित करें: आपको आयात करना होगा

#import <QuartzCore/QuartzCore.h>

कोने त्रिज्या का उपयोग करने के लिए।

यह कोशिश करें कि यह निश्चित रूप से काम करेगा

UITextView* txtView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 300, 100)];
txtView.layer.cornerRadius = 5.0;
txtView.clipsToBounds = YES;

जैसा कि रोब ने यह पता लगाया कि यदि आप चाहते हैं कि सीमा का रंग समान हो UITextFieldतो आपको सीमा की चौड़ाई को 2.0 में बदलना होगा और निम्न पंक्ति को जोड़कर ग्रे रंग में बदलना होगा।

[textView.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor]]; 
[textView.layer setBorderWidth:2.0];

2
मैं सोच रहा था कि यह काम क्यों नहीं कर रहा था। क्वार्ट्जकोर के बारे में टिपऑफ के लिए धन्यवाद।
Echilon

23

मैं असली सौदा चाहता था, इसलिए मैं इसके UIImageViewएक उप के रूप में जोड़ता हूं UITextView। यह देशी बॉर्डर से मेल खाता है UITextField, जिसमें ऊपर से नीचे तक ढाल शामिल है:

textView.backgroundColor = [UIColor clearColor];
UIImageView *borderView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, textView.frame.size.width, textView.frame.size.height)];
borderView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
UIImage *textFieldImage = [[UIImage imageNamed:@"TextField.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 8, 15, 8)];
borderView.image = textFieldImage;
[textField addSubview: borderView];
[textField sendSubviewToBack: borderView];

ये वे चित्र हैं जिनका मैं उपयोग करता हूं:

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें


2
मुझे लगता है कि आपको UITextBorderStyle का टेक्स्टव्यू बताने की भी ज़रूरत है, अगर आपने XCode में पहले से सेट नहीं किया है
सुपरलॉजिकल

1
मैं पुनः अपलोड PNG छवियों
बेन पैकार्ड

5
जब आप UITextView को स्क्रॉल करते हैं, तो कोई भी पृष्ठभूमि अच्छी नहीं होती है। मुझे लगता है कि मैं यह सब एक मूल UIView में रखना होगा।
ओलिवर पियरमैन

1
अति उत्कृष्ट। यह बहुत अच्छा लग रहा है: D
Sune Trudslev

12

एक समाधान UITextView के नीचे एक UITextField जोड़ना है , UITextViewपृष्ठभूमि को पारदर्शी बनाना है और किसी भी उपयोगकर्ता इंटरैक्शन को अक्षम करना है UITextField। फिर कोड में UITextFieldफ्रेम को कुछ इस तरह से बदलें

self.textField.frame = CGRectInset(self.textView.frame, 0, -2);

आपके पास टेक्स्ट फ़ील्ड के समान ही दिखाई देगा।

और जैसा कि जॉन ने सुझाव दिया है , आपको [UIViewController viewDidLayoutSubviews]आईओएस 5.0+ पर कोड का यह टुकड़ा अंदर रखना चाहिए ।


1
यह इतना आसान था और लगता है कि मैं इसे कैसे देखना चाहता था। मैंने UITextField के फ्रेम को UITextView से मिलान किया: CGRect फ्रेम = self.myTextView .frame; फ्रेम.साइज़। हाइट + = 2; self.myTextField.frame = फ्रेम;
बायिन ब्रायन

1
प्यारा जवाब। साफ और सरल। viewDidLayoutSubviews:(IOS 5.0+) में कोड डालें ।
जॉन

1
अच्छा, यह अंत में मेरे साथ गया था। ध्यान दें कि जब तक मैं जॉन की टिप्पणी का उपयोग नहीं करता, तब तक यह काम नहीं करता था: viewDidLayoutSubviews:
डावर

1
यह सबसे तेज था, और सबसे अच्छा लग रहा था।
वेस्टन

5

सर्वश्रेष्ठ प्रभाव के लिए आपको एक कस्टम (स्ट्रेचेबल) पृष्ठभूमि छवि का उपयोग करना होगा। यह भी कि किस तरह से UITextFieldगोल बॉर्डर तैयार किया गया है।


4

प्रोग्रामिंग के बिना इसे करने का एक तरीका यह है कि टेक्स्टफील्ड की पृष्ठभूमि को पारदर्शी बनाया जाए, फिर इसके पीछे एक राउंड रेक्ट बटन रखें। इसे अक्षम करने और Disable adjusts imageचेकबॉक्स को अनचेक करने के लिए बटन सेटिंग्स बदलना सुनिश्चित करें ।


4

आप DCKit नामक मेरी लाइब्रेरी की जाँच कर सकते हैं ।

आप सीधे UIViewसे एक गोल कोने वाला टेक्स्ट व्यू (साथ ही टेक्स्ट फील्ड / बटन / प्लेन ) बना पाएंगे Interface Builder:

DCKit: UITextView की सीमा

इसकी कई अन्य उपयोगी विशेषताएं भी हैं, जैसे सत्यापन के साथ पाठ क्षेत्र, सीमाओं के साथ नियंत्रण, धराशायी सीमाएं, सर्कल और हेयरलाइन आदि।


4

मुझे पता है कि इस एक के लिए पहले से ही बहुत सारे उत्तर हैं, लेकिन मुझे वास्तव में उनमें से कोई भी पर्याप्त नहीं मिला (कम से कम स्विफ्ट में)। मैं एक ऐसा समाधान चाहता था जो UITextField की तरह ही सटीक बॉर्डर प्रदान करता हो (न कि एक अनुमानित एक जैसा जो अभी दिखता है, ठीक वैसा ही दिखता है, लेकिन एक ऐसा है जो बिल्कुल ऐसा दिखता है और हमेशा वैसा ही दिखेगा)। मुझे बैकग्राउंड के लिए UITextView को वापस करने के लिए एक UITextField का उपयोग करने की आवश्यकता थी, लेकिन हर बार अलग से इसे बनाना नहीं चाहते थे।

नीचे दिया गया समाधान एक UITextView है जो सीमा के लिए अपने स्वयं के UITextField की आपूर्ति करता है। यह मेरे पूर्ण समाधान का एक ट्रिम किया गया संस्करण है (जो इसी तरह से UITextView में "प्लेसहोल्डर" समर्थन जोड़ता है) और यहां पोस्ट किया गया था: https://stackoverflow.com/a/36561236/1227119

// This class implements a UITextView that has a UITextField behind it, where the 
// UITextField provides the border.
//
class TextView : UITextView, UITextViewDelegate
{
    var textField = TextField();

    required init?(coder: NSCoder)
    {
        fatalError("This class doesn't support NSCoding.")
    }

    override init(frame: CGRect, textContainer: NSTextContainer?)
    {
        super.init(frame: frame, textContainer: textContainer);

        self.delegate = self;

        // Create a background TextField with clear (invisible) text and disabled
        self.textField.borderStyle = UITextBorderStyle.RoundedRect;
        self.textField.textColor = UIColor.clearColor();
        self.textField.userInteractionEnabled = false;

        self.addSubview(textField);
        self.sendSubviewToBack(textField);
    }

    convenience init()
    {
        self.init(frame: CGRectZero, textContainer: nil)
    }

    override func layoutSubviews()
    {
        super.layoutSubviews()
        // Do not scroll the background textView
        self.textField.frame = CGRectMake(0, self.contentOffset.y, self.frame.width, self.frame.height);
    }

    // UITextViewDelegate - Note: If you replace delegate, your delegate must call this
    func scrollViewDidScroll(scrollView: UIScrollView)
    {
        // Do not scroll the background textView
        self.textField.frame = CGRectMake(0, self.contentOffset.y, self.frame.width, self.frame.height);
    }        
}

3

प्रोग्रामिंग के बिना इसे करने का एक तरीका मुझे टेक्स्टफ़ील्ड बैकग्राउंड को पारदर्शी बनाना है, फिर इसके पीछे एक राउंड रेक्ट बटन रखें। इसे अक्षम करने के लिए बटन सेटिंग्स बदलना सुनिश्चित करें और अक्षम करें छवि चेकबॉक्स को अनचेक करें।

क्वार्ट्जकोर कोड की कोशिश की और पाया कि यह मेरे पुराने 3 जी (मैं परीक्षण के लिए उपयोग) पर अंतराल का कारण बना। एक बड़ा मुद्दा नहीं है, लेकिन अगर आप अलग-अलग आईओएस और हार्डवेयर के लिए जितना संभव हो उतना समावेशी होना चाहते हैं, तो मैं ऊपर एंड्रयू के जवाब की सिफारिश करता हूं - या अपनी खुद की छवियां बनाएं और तदनुसार आवेदन करें।


3

एक महान पृष्ठभूमि छवि है जो UITextViewiPhone के संदेश ऐप में पाठ संदेश भेजने के लिए उपयोग किए जाने के समान है । आपको इसे प्राप्त करने और संशोधित करने के लिए Adobe Illustrator की आवश्यकता होगी। iphone यूआई वेक्टर तत्व


3
#import <QuartzCore/QuartzCore.h>
- (void)viewDidLoad{
  UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 220, 200, 100)];
  textView.layer.cornerRadius = 5;
  textView.clipsToBounds = YES;
  [textView.layer setBackgroundColor: [[UIColor whiteColor] CGColor]];
  [textView.layer setBorderColor: [[UIColor grayColor] CGColor]];
  [textView.layer setBorderWidth: 1.0];
  [textView.layer setCornerRadius:8.0f];
  [textView.layer setMasksToBounds:YES];
  [self.view addSubView:textview];
}

2

आप एक टेक्स्ट फील्ड बना सकते हैं, जो इस तरह से टेक्स्ट व्यू के शीर्ष पर किसी भी घटना को स्वीकार नहीं करता है:

CGRect frameRect = descriptionTextField.frame;
frameRect.size.height = 50;
descriptionTextField.frame = frameRect;
descriptionTextView.frame = frameRect;
descriptionTextField.backgroundColor = [UIColor clearColor];
descriptionTextField.enabled = NO;
descriptionTextView.layer.cornerRadius = 5;
descriptionTextView.clipsToBounds = YES;

या बस इंटरफ़ेस बिल्डर में एक पाठ क्षेत्र बनाते हैं। फिर कोड में ऊंचाई सेट करें (चूंकि इंटरफ़ेस बिल्डर आपको नहीं देगा)। CGRect फ्रेम-रेक्ट = self.textField.frame; फ्रेमरेक्ट.साइज़.हीट = 50; self.textField.frame = फ्रेमरेक्ट;
ऑड

2

यदि आप अपने नियंत्रक कोड को साफ रखना चाहते हैं, तो आप नीचे दिए गए तरह UITextView को उप-वर्ग कर सकते हैं और इंटरफ़ेस बिल्डर में वर्ग का नाम बदल सकते हैं।

RoundTextView.h

#import <UIKit/UIKit.h>
@interface RoundTextView : UITextView
@end

RoundTextView.m

#import "RoundTextView.h"
#import <QuartzCore/QuartzCore.h>
@implementation RoundTextView
-(id) initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.333] CGColor]];
        [self.layer setBorderWidth:1.0];
        self.layer.cornerRadius = 5;
        self.clipsToBounds = YES;
    }
    return self;
}
@end

1

यहाँ मेरा समाधान है:

- (void)viewDidLoad {
    [super viewDidLoad];


    self.textView.text = self.messagePlaceholderText;
    self.textView.layer.backgroundColor = [[UIColor whiteColor] CGColor];
    self.textView.layer.borderColor = [[[UIColor grayColor] colorWithAlphaComponent:0.3] CGColor];
    self.textView.layer.borderWidth = 0.5;
    self.textView.layer.cornerRadius = 5.5f;
    self.textView.layer.masksToBounds = YES;
    self.textView.textColor = [[UIColor grayColor] colorWithAlphaComponent:0.4];
}

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if (textView == self.tvMessage) {
        // Delete placeholder text
        if ([self.textView.text isEqualToString:self.messagePlaceholderText]) {
            self.textView.text = @"";
            self.textView.textColor = [UIColor blackColor];
        }
    }
}

- (void)textViewDidEndEditing:(UITextView *)textView {
    if (textView == self.tvMessage) {
        // Write placeholder text
        if (self.textView.text.length == 0) {
            self.textView.text = self.messagePlaceholderText;
            self.textView.textColor = [[UIColor grayColor] colorWithAlphaComponent:0.4];
        }
    }
}

0

मुझे नहीं लगता कि यह संभव है। लेकिन आप UITableView1 समूह और 1 खाली सेल के साथ (समूहित) कर सकते हैं और इसे अपने कंटेनर के रूप में उपयोग कर सकते हैं UITextView


0

यह एक पुराना प्रश्न है, और मुझे इस प्रश्न के उत्तर के लिए भी खोजा गया था। luvieeres का उत्तर 100% सही है और बाद में रोब ने कुछ कोड जोड़े। यह उत्कृष्ट है, लेकिन मुझे दूसरे प्रश्न के उत्तर में एक तीसरी पार्टी मिली जो मुझे बहुत मददगार लगती है। मुझे न केवल UITextFieldओवर के समान लुक के UITextViewलिए खोजा गया था, मुझे मल्टीलाइन समर्थन के लिए भी खोजा गया था। ChatInputSample ने दोनों को संतुष्ट किया। इसलिए मुझे लगता है कि यह तीसरी पार्टी दूसरों के लिए मददगार हो सकती है। इसके अलावा तैमूर के लिए धन्यवाद, उन्होंने यहां इस खुले स्रोत का उल्लेख किया ।


0

IOS7 में निम्नलिखित मैच पूरी तरह से UITextField सीमा (मेरी नजर में कम से कम):

textField.layer.borderColor = [[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor];
textField.layer.borderWidth = 0.5;
textField.layer.cornerRadius = 5;
textField.clipsToBounds = YES;

कुछ विशेष आयात करने की आवश्यकता नहीं है।

@Uvieere और @hanumanDev को धन्यवाद जिनके उत्तर मुझे लगभग मिलते हैं :)


-1

कैसे बस के बारे में:

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 280, 32)];
textField.borderStyle = UITextBorderStyleRoundedRect;
[self addSubview:textField];

प्रश्न टेक्स्टव्यू के बारे में है।
आजिक अब्दुल्ला

क्षमा करें - खुश ढेर प्रतिक्रिया ट्रिगर। यह जानने के लिए इच्छुक होंगे कि वे केवल सेट के UITextFieldसाथ क्यों उपयोग नहीं कर सकते हैं । userInteractionEnabledNO
jowie

टेक्स्टफ़ील्ड कई लाइनों का समर्थन नहीं करता है
अज़िक अब्दुल्ला

समझ लिया। स्पष्ट करने के लिए धन्यवाद
jowie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.