iOS-如何通过自定义获得UIAlertView宽度并将UILabel置于中心位置

时间:2015-02-16 06:44:57

标签: ios center uialertview

我自定义UIAlertView,我需要在alertView中添加一些组件(如label,tableview)。

但我有一个问题。我需要知道alertView的宽度。

我尝试添加self.frame.size.width,但我刚收到0.000000

如何获取alertView的宽度?

我将计算将子视图放在,并将UILabel置于子视图中心。我的部分代码如下:

.h文件:

 #import <UIKit/UIKit.h>

 @interface CustomTableViewAlert : UIAlertView

 -(instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...;


 @end

.m文件:

   #import "CustomTableViewAlert.h"

  ...
   @implementation CustomTableViewAlert


 -(instancetype) initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
 {
   self = [super initWithTitle:title message:message delegate:self      cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil];

if( self )
{

 NSLog(@"=====self.frame.size.width:%f",self.frame.size.width);
 // ^^^^^^^^^^^^^^ I got 0.000000

    CGSize screenSize = [UIScreen mainScreen].bounds.size;

    float showInAlertWidth = screenSize.width - 100;
    float showInAlertHeight = 150;

    CGSize textSize = [[notFoundDeviceLabel text] sizeWithAttributes:@{NSFontAttributeName:[notFoundDeviceLabel font]}];

    CGFloat strikeWidth = textSize.width;
    CGFloat strikeHeight = textSize.height;
    [notFoundDeviceLabel setFrame:CGRectMake(0, 0, screenSize.width, showInAlertHeight)];

    notFoundDeviceLabel.text = @"No Device found";
    notFoundDeviceLabel.textAlignment = NSTextAlignmentCenter;

    // new container view
    containerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, screenSize.width, showInAlertHeight)];
    containerView.backgroundColor = [UIColor yellowColor];

    [containerView addSubview: notFoundDeviceLabel];
}

return self;
 }

非常感谢。

2 个答案:

答案 0 :(得分:1)

虽然继承UIAlertView可能(并且很有可能)会导致Apple拒绝您的应用,但它仍然可能。您必须覆盖layoutSubviewsdrawRect。我找到了相当不错的教程here,它遍历了查找警报视图的活动边界和插入的过程,这将允许您找到宽度。

请记住:

  1. UIAlertView并不打算进行子类化。
  2. 从iOS 8开始,UIAlertView已弃用,您应该使用UIAlertController。

答案 1 :(得分:0)

你不应该是UIAlertView的子类,APPLE从iOS 7开始严格说不。您所要做的就是创建一个自定义UIView,根据您的要求添加UITableView作为子视图等。

UIAlertController是iOS 8的新功能,因此采用它对iOS 8来说可能听起来不错,但对于iOS 7来说这可能会有问题。

最好使用UIView子类而不是UIAlertView。