둥근 사각형 텍스트 필드처럼 UITextview의 스타일을 지정하는 방법은 무엇입니까?


170

텍스트 작성기를 댓글 작성기로 사용하고 있습니다.

속성 관리자에서 테두리 스타일 속성과 같은 것을 찾을 수 없으므로 둥근 사각형을 사용할 수 있습니다 UITextField.

그래서, 질문은 : 나는 스타일을 어떻게 UITextView유사한을 UITextField둥근 RECT로?


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 grayColor] colorWithAlphaComponent : 0.5] CGColor]]; [textView.layer setBorderWidth : 2.0];
Rob

12
#import <QuartzCore / QuartzCore.h>가 있어야합니다. 내가 QuartzCore를 가져 오지 않았기 때문에 나는 문제가 있었다
오스틴

1
나 같은 n00bs를 들어, 참고의 가치 : :-)하지 initWithNibName에있는 viewDidLoad에서이 코드를 넣어
브라이언 Colavito

1
속성을로 설정하여 a UITextField를 사용할 수 있습니다 -아래 내 게시물을 참조하십시오. borderStyleUITextBorderStyleRoundedRect
jowie

5
iOS 7-borderWidth 1.0 및 alpha .2는 기본 스타일로 작동합니다.
Kalel Wade

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가 텍스트 필드에 더 가깝다고 말하지만이 답변의 회색 색상이 선택한 답변보다 낫습니다.
피터 DeWeese

2
물론이 답변에 QuartzCore Framework를 추가하고 #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의 프레임 색상이 약간 다릅니다.
Makalele

1
.borderWidth = 0.7로 만들면 iOS 11에서 볼 수있는 현재 스타일에 가깝게 보입니다.
Chris Amelinckx

28

편집 : 가져와야합니다

#import <QuartzCore/QuartzCore.h>

코너 반경을 사용합니다.

이것을 시도하십시오 그것은 확실히 작동합니다

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

Rob이 테두리 색상을 비슷하게 설정 UITextField하려면 다음 줄을 추가하여 테두리 너비를 2.0으로 변경하고 색상을 회색으로 변경 해야하는 경우

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

2
왜 이것이 작동하지 않는지 궁금했습니다. QuartzCore에 대한 팁을 주셔서 감사합니다.
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 없음이 없다하는 텍스트 뷰를 알 필요가 있다고 생각
superlogical

1
png 이미지를 다시 업로드했습니다
Ben Packard

5
UITextView를 스크롤하면 배경이 움직이지 않습니다. 부모 UIView에 모두 배치해야한다고 생각합니다.
Oliver Pearmain

1
우수한. 멋지다 : D
Sune Trudslev

12

한 가지 해결책은 UITextView 아래에 UITextField추가 하고 UITextView배경을 투명하게 만들고에 대한 사용자 상호 작용을 비활성화하는 것 UITextField입니다. 그런 다음 코드에서 UITextField프레임을 다음과 같이 변경하십시오.

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

텍스트 필드와 모양이 정확히 같습니다.

Jon이 제안한 [UIViewController viewDidLayoutSubviews]대로이 코드 조각 을 iOS 5.0 이상에 넣어야합니다 .


1
이것은 매우 간단하고 내가 원하는 방식으로 정확하게 보입니다. 방금 UITextField의 프레임을 UITextView와 일치 시켰습니다. CGRect frame = self.myTextView.frame; frame.size.height + = 2; self.myTextField.frame = 프레임;
Buyin Brian

1
사랑스러운 답변입니다. 깨끗하고 간단합니다. 코드를 넣습니다 viewDidLayoutSubviews:(iOS 5.0 이상).
Jon

1
니스, 이것은 내가 결국 함께 갔던 ln였다. Jon의 주석 re : viewDidLayoutSubviews를 사용하기 전까지는 작동하지 않았습니다.
daver

1
이것은 가장 빠르며 최고로 보입니다.
Weston

5

최상의 효과를 얻으려면 사용자 정의 (신축 가능한) 배경 이미지를 사용해야합니다. 이것 UITextField의 둥근 테두리가 그려지 는 방식이기도합니다 .


4

프로그래밍 없이이 작업을 수행 한 방법은 텍스트 필드 배경을 투명하게 만든 다음 그 뒤에 둥근 사각형 버튼을 배치하는 것입니다. 버튼 설정을 변경하여 비활성화하고 Disable adjusts image확인란의 선택을 취소하십시오 .


4

DCKit 이라는 내 라이브러리를 확인하고 싶을 수도 있습니다 .

다음에서 직접 둥근 모서리 텍스트보기 (및 텍스트 필드 / 단추 / 평야 UIView)를 만들 수 Interface Builder있습니다.

DCKit : 경계 UITextView

또한 유효성 검사가 포함 된 텍스트 필드, 테두리가있는 컨트롤, 점선 테두리, 원 및 헤어 라인보기와 같은 다른 유용한 기능이 많이 있습니다.


4

나는 이미 이것에 대한 많은 답변이 있다는 것을 알고 있지만 (적어도 Swift에서는) 충분한 것을 찾지 못했습니다. UITextField와 동일한 정확한 경계를 제공하는 솔루션을 원했습니다 (지금 보이는 것처럼 보이는 근사한 것이 아니라 정확하게 모양을 유지하고 항상 정확하게 보이는 것). 배경에 대한 UITextView를 백업하기 위해 UITextField를 사용해야했지만 매번 별도로 만들 필요는 없었습니다.

아래 솔루션은 테두리에 고유 한 UITextField를 제공하는 UITextView입니다. 이것은 내 전체 솔루션의 트림 된 버전이며 (유사한 방식으로 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

프로그래밍 없이이 작업을 수행 한 방법은 텍스트 필드 배경을 투명하게 만든 다음 그 뒤에 둥근 사각형 버튼을 배치하는 것입니다. 버튼 설정을 변경하여 비활성화하고 이미지 조정 비활성화 확인란의 선택을 취소하십시오.

Quartzcore 코드를 시험해 보니 이전 3G에서 테스트 지연이 발생했습니다. 큰 문제는 아니지만 다른 ios 및 하드웨어에 대해 가능한 한 포괄적이 되려면 위의 Andrew_L의 답변을 권장하거나 자신의 이미지를 만들고 그에 따라 적용하십시오.


3

UITextViewiPhone의 메시지 앱에서 문자 메시지를 보내는 데 사용되는 것과 동일한 훌륭한 배경 이미지가 있습니다. 가져오고 수정하려면 Adobe Illustrator가 필요합니다. 아이폰 ui 벡터 요소


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 frameRect = self.textField.frame; frameRect.size.height = 50; self.textField.frame = frameRect;
audub

2

컨트롤러 코드를 깨끗하게 유지하려면 아래와 같이 UITextView를 서브 클래스로 만들고 Interface Builder에서 클래스 이름을 변경할 수 있습니다.

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 % 정확하며 나중에 Rob은 몇 가지 코드를 추가했습니다. 훌륭하지만 다른 질문에 대한 답변 에서 제게 도움이 된 것을 발견했습니다 . 난 단지의 유사 검색되지 않은 UITextField이상 UITextView나 또한 여러 지원을 검색했다. ChatInputSample이 둘 다 만족했습니다. 그렇기 때문에 나는이 제 3자가 다른 사람들에게 도움이 될 것이라고 생각합니다. 또한 Timur 덕분에이 오픈 소스를 여기 에서 언급했습니다 .


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];

질문은 텍스트 뷰에 관한 것입니다.
Azik Abdullah

죄송합니다. 행복한 스택 응답을 트리거하십시오. UITextFielduserInteractionEnabled설정하여를 사용할 수없는 이유를 알고 싶습니다 NO.
jowie

Textfield는 여러 줄을 지원하지 않습니다
Azik Abdullah

이해했다. 명확 해 주셔서 감사합니다
jowie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.