0

プレースホルダーと背景画像用にサブクラス化された UITextView があります。

これがコードです

BKCUTextView.h

#import <UIKit/UIKit.h>

@interface BKCUTextView : UITextView
- (void)setPlaceholder:(NSString *)placeholder;
- (void)setPlaceholderColor:(UIColor *)placeholderColor;
- (void)setBackgroundImage:(UIImage *)img;
@end

BKCUTextView.m

#import "BKCUTextView.h"
@interface BKCUTextView()
{
    NSString    * _placeholder;
    UIColor     * _normalColor;
    UIColor     * _placeholderColor;
    BOOL        _needToShowPlaceholder;
    UIImageView * _bgImageView;
}
@end

@implementation BKCUTextView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [self _initEvents];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    if(_needToShowPlaceholder)   {   [_placeholder drawAtPoint:CGPointMake(0, 0) withFont:self.font];    }
}

- (void)setTextColor:(UIColor *)textColor
{
    _normalColor = textColor;
}

- (void)setPlaceholderColor:(UIColor *)placeholderColor
{
    _placeholderColor = placeholderColor;
}

- (void)setPlaceholder:(NSString *)placeholder
{
    _needToShowPlaceholder = YES;
    _placeholder = placeholder;
}

-(void)setBackgroundImage:(UIImage *)img
{
    if(_bgImageView == nil)
    {
        _bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
        [self addSubview:_bgImageView];
        [self sendSubviewToBack:_bgImageView];
        [self bringSubviewToFront:self];
    }
    [_bgImageView setImage:img];
}

- (void)_initEvents
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_textChanged:) name:UITextViewTextDidChangeNotification object:self];
}

-(void)_textChanged:(NSNotification *)noti
{
    _needToShowPlaceholder = (self.text.length == 0);
    if(_needToShowPlaceholder)  {   self.textColor = _placeholderColor; }
    else                        {   self.textColor = _normalColor;      }
    [self setNeedsDisplay];
}

実例

BKCUTextView * tv = [[BKCUTextView alloc] initWithFrame:CGRectMake(5, 55, 300, 50)];
[tv setBackgroundColor:[UIColor darkGrayColor]];
[tv setTextColor:[UIColor whiteColor]];
[tv setPlaceholderColor:[UIColor grayColor]];
[tv setPlaceholder:@"placeholder here!"];
[tv setBackgroundImage:[UIImage imageNamed:@"btn_coin_prs.png"]];
[self.view addSubview:tv];

[self.view bringSubviewToFront:tv];

各プロパティ (backgroundImage と placeholderText) は正常に動作しますが、それらを一緒に設定すると、プレースホルダーが backgroundImage の下に描画されます。

背面の画像の上にテキストを表示するにはどうすればよいですか?

4

1 に答える 1

0

この方法を試してください[self bringSubviewToFront:];

それが役立つことを願っています!

于 2013-09-02T07:01:58.917 に答える