我正在使用子类UIAlertView窗口作为我的应用程序中的登录提示(我知道它违反Apple指南,但它不会提交给appstore,所以这不是问题)。
添加文本字段并在屏幕上定位窗口的代码如下所示:
- (id)initWithTitle:(NSString *)title delegate:(id)delegate
{
if (self = [super initWithTitle:title message:@"\n\n\n" delegate:delegate cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login", nil]) {
UITextField *loginTF = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 55.0, 260.0, 25.0)];
// text field settings removed for code clarity
[self addSubview:loginTF];
self.loginTextField = loginTF;
[loginTF release];
UITextField *passwordTF = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 85.0, 260.0, 25.0)];
// text field settings removed for code clarity
[self addSubview:passwordTF];
self.passwordTextField = passwordTF;
[passwordTF release];
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 90.0);
[self setTransform:translate];
}
return self;
}
问题在于setTransform
调用:
:
- 没有setTransform
:窗口在屏幕上水平和垂直居中显示,屏幕键盘部分显示在屏幕上 - 因此整个窗口不可见
- 使用setTransform
:窗口显示高出90个像素,因此显示的屏幕键盘完全可见。
:
- 没有setTransform
:窗口显示完美(在屏幕键盘上方可见)
- 使用setTransform
:窗口部分显示在屏幕的上边框上方(90像素太高)。
这个问题的最佳解决方案是什么?检测iOS版本并有条件地调用setTransform
?或者它太难看了,有更好的方法吗?
答案 0 :(得分:2)
由于iOS 4已经针对较新的设备发布(iOS 4.2 for iPad即将推出),我建议将Base SDK设置为最新版本的iOS 4,并使用此版本编译您的应用程序。但是,如果您希望您的应用程序可供原始iPhone和iPod Touch用户使用,则有条件地使用setTransform
方法是最好的方法。
答案 1 :(得分:0)
您在UIAlertView中添加的任何(文本)都显示为标签。因此,如果您想添加文本字段,只需在所有标签的顶部添加文本字段,然后向下移动标签。这就是我所做的,
- (void) drawRect:(CGRect)rect {
[super drawRect:rect];
CGRect labelFrame = CGRectMake(0, 0, 0, 0); // init if no label is there
NSArray *views = [self subviews];
for (UIView *view in views){
if ([view isKindOfClass:[UILabel class]]) {
labelFrame = view.frame;
} else {
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y + kTextFieldHeight , view.frame.size.width, view.frame.size.height);
}
}
CGRect myFrame = self.frame;
self.textField.frame = CGRectMake(95, labelFrame.origin.y+labelFrame.size.height + 5.0, kTextFieldWidth, kTextFieldHeight);
self.frame = CGRectMake(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height + kTextFieldHeight);
}