在iOS 7中自定义UIView方向问题

4

我的方法可以在iOS 8及以上版本中成功地将UIView自定义为警报消息的样式,但在iOS 7中仅支持纵向模式显示。

我的iPad应用程序部署目标是iOS 7,设备方向仅支持左横屏和右横屏。

iOS 7屏幕截图:

enter image description here

iOS 8屏幕:

enter image description here

我的代码在ViewController.m这里

- (IBAction)submitBtnActiion:(id)sender
{
    if (self.emailField.text.length == 0 || self.phoneNoField.text.length == 0 || self.passField.text.length == 0) {

        QAlertView *alert = [[QAlertView alloc]
            initWithAlertTitle:@"Message"
                   withMessage:@"Please ensure that all required fields are completed"
                   withContent:nil
              withCancelButton:@"OK"
               withOtherButton:nil];

        alert.delegate = self;

        [alert showInWindow];

        return;
    }
}

QAlertView.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@protocol QAlertDelegate <NSObject>

- (void)QAlertView:(QAlertView *)alertView
    clickedAtButtonIndex:(NSInteger)index;

@end

@protocol QAlertDelegate;

@interface QAlertView : UIView

@property(nonatomic) BOOL isAdjustKeyboardOnResign;

@property(nonatomic) CGFloat adjustedValue;

@property(nonatomic) NSString *message;

@property(nonatomic, assign) id<QAlertDelegate> delegate;

- (id)initWithAlertTitle:(NSString *)title
             withMessage:(NSString *)message
             withContent:(UIView *)contentView
        withCancelButton:(NSString *)button
         withOtherButton:(NSString *)otherButton;
- (void)showInWindow;

@end

QAlertView.m

#import "QHeaders.h"

@implementation QAlertView 
{
  UIView *messageView;
}
@synthesize isAdjustKeyboardOnResign;

@synthesize adjustedValue;

- (CGRect)getBounds {

  [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
  CGRect screenBounds = [UIScreen mainScreen].bounds;

  NSString *ver = [[UIDevice currentDevice] systemVersion];

  float ver_float = [ver floatValue];

  if (ver_float >= 8.0) {
    return screenBounds;
  }

  CGFloat width = CGRectGetWidth(screenBounds);

  CGFloat height = CGRectGetHeight(screenBounds);

  UIInterfaceOrientation interfaceOrientation =
      [UIApplication sharedApplication].statusBarOrientation;

  if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
    screenBounds.size = CGSizeMake(width, height);
  } else if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
    screenBounds.size = CGSizeMake(height, width);
  }
  return screenBounds;
}

- (id)initWithAlertTitle:(NSString *)title
             withMessage:(NSString *)message
             withContent:(UIView *)contentView
        withCancelButton:(NSString *)button
         withOtherButton:(NSString *)otherButton {

    _message = message;

    bool temp = NO;
    bool temp1 = NO;

    if (self = [super initWithFrame:[self getBounds]]) {
        self.backgroundColor = [UIColor blueColor];
    }

    UIView *alerView =
    [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 1024)];

    [alerView setBackgroundColor:[UIColor colorWithRed:(23 / 255.0)
                                                 green:(26 / 255.0)
                                                  blue:(31 / 255.0)
                                                 alpha:0.6]];

    [self addSubview:alerView];

    CGFloat adjustedHeight = ALERT_HEIGHT;

    if (contentView) {
        CGFloat actualHeight = contentView.frame.size.height;

        adjustedHeight = actualHeight + (2 * BUTTON_HEIGHT);


    }

    if ([message isEqualToString:@"DisplayTableMapPopup"]) {



        messageView = [[UIView alloc]
                       initWithFrame:CGRectMake(120,155,ALERT_WIDTH, adjustedHeight)];

        _message = @"";

        message = @"";

        temp = YES;



    }else if ([message isEqualToString:@"TableSettingPopup"]){

        messageView = [[UIView alloc]
                       initWithFrame:CGRectMake(
                                                ((self.frame.size.width - 453) / 2)+30,
                                                ((self.frame.size.height - adjustedHeight) / 2)+24,
                                                453, 315)];

        _message = @"";

        message = @"";

        temp1 = YES;


    }else{
         messageView = [[UIView alloc]
                           initWithFrame:CGRectMake(
                                                    ((self.frame.size.width - ALERT_WIDTH) / 2),
                                                    ([QNotifier sharedInstance].qAlertKeyboardDisplay ==
                                                     YES)
                                                    ? ((self.frame.size.height - adjustedHeight) / 2) -
                                                    115
                                                    : ((self.frame.size.height - adjustedHeight) / 2),
                                                    ALERT_WIDTH, adjustedHeight)];
}
 [QNotifier sharedInstance].qAlertKeyboardDisplay = NO;

    messageView.backgroundColor = [UIColor colorWithRed:235.0f / 255.0f
                                                  green:235.0f / 255.0f
                                                   blue:236.0f / 255.0f
                                                  alpha:1.0f];

    messageView.layer.cornerRadius = 10.0f;

    [messageView.layer setMasksToBounds:YES];

    [messageView setUserInteractionEnabled:YES];

    // INITIATE THE TITLE FOR THE ALERT VIEW

    UILabel *titleLabel = [[UILabel alloc]
                           initWithFrame:CGRectMake(0, 5, ALERT_WIDTH, BUTTON_HEIGHT)];

    titleLabel.backgroundColor = [UIColor clearColor];

    titleLabel.textAlignment = NSTextAlignmentCenter;

    titleLabel.text = title;

    titleLabel.font = [UIFont fontWithName:ROBOTO_MEDIUM size:15.0f];

    [messageView addSubview:titleLabel];

    if (contentView) {
        // NEED TO INCUDE THE CONTENT VIEW MIDDLE OF TITLE AND BUTTON.

        [messageView addSubview:contentView];
    } else {
        // NEED TO INCLUDE THE MESSAGE IN THE MIDDLE OF TITLE AND BUTTON

        UILabel *contentLabel = [[UILabel alloc]
                                 initWithFrame:CGRectMake(10, BUTTON_HEIGHT - 5, ALERT_WIDTH - 20,
                                                          DEFAULT_CONTENT_HEIGHT + 5)];

        contentLabel.backgroundColor = [UIColor clearColor];

        contentLabel.textAlignment = NSTextAlignmentCenter;

        contentLabel.textColor = ALERT_TEXTCOLOR;

        contentLabel.numberOfLines = 4;

        contentLabel.adjustsFontSizeToFitWidth = YES;

        contentLabel.text = message;

        contentLabel.font = [UIFont fontWithName:ROBOTO_LIGHT size:14.0f];

        [messageView addSubview:contentLabel];
    }

    // TWO BUTTONS HAS VALUES.

    UILabel *dividerLabel = [[UILabel alloc]init];

    if (temp) {

        dividerLabel.frame=CGRectMake(0,(messageView.frame.size.height - BUTTON_HEIGHT)-3,
                                      ALERT_WIDTH, 1);


    }else if(temp1){

        dividerLabel.frame=CGRectMake(0,(messageView.frame.size.height - BUTTON_HEIGHT),
                                      453, 1);



    }else{

        dividerLabel.frame=CGRectMake(0,(messageView.frame.size.height - BUTTON_HEIGHT),
                                      ALERT_WIDTH, 1);

    }

    dividerLabel.backgroundColor = [UIColor colorWithRed:(212 / 255.0)
                                                   green:(216 / 255.0)
                                                    blue:(217 / 255.0)
                                                   alpha:1];

    [messageView addSubview:dividerLabel];

    NSInteger limit = (otherButton == nil || button == nil) ? 1 : 2;

    for (NSInteger i = 0; i < limit; i++) {
        if (i) {
            UILabel *buttonDividerLabel = [[UILabel alloc]
                                           initWithFrame:CGRectMake(
                                                                    (i * (ALERT_WIDTH / limit)),
                                                                    (messageView.frame.size.height - BUTTON_HEIGHT), 1,
                                                                    BUTTON_HEIGHT)];

            buttonDividerLabel.backgroundColor = [UIColor colorWithRed:(212 / 255.0)
                                                                 green:(216 / 255.0)
                                                                  blue:(217 / 255.0)
                                                                 alpha:1];

            [messageView addSubview:buttonDividerLabel];
        }

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];



        [btn setFrame:CGRectMake((i * (ALERT_WIDTH / limit)),
                                 (messageView.frame.size.height - BUTTON_HEIGHT),
                                 ALERT_WIDTH / limit, BUTTON_HEIGHT)];

        if (temp1) {

            [btn setFrame:CGRectMake((i * (453 / limit)),
                                     (messageView.frame.size.height - BUTTON_HEIGHT),
                                     453 / limit, BUTTON_HEIGHT)];

        }

        btn.tag = i;

        NSString *btnString;

        UIColor *textColor;

        if (limit > 1) {
            btnString = (i) ? otherButton : button;

            textColor = (i) ? BUTTON_TEXTCOLOR : [UIColor lightGrayColor];
        } else {
            if (otherButton) {
                btnString = otherButton;
            } else {
                btnString = button;
            }

            textColor = BUTTON_TEXTCOLOR;
        }

        [btn setTitle:btnString forState:UIControlStateNormal];

        [btn setExclusiveTouch:YES];

        [btn addTarget:self
                action:@selector(buttonClicked:)
      forControlEvents:UIControlEventTouchUpInside];

        [btn.titleLabel setFont:[UIFont fontWithName:ROBOTO_MEDIUM size:(temp1)?16:15.0f]];

        [btn setTitleColor:textColor forState:UIControlStateNormal];

        [messageView addSubview:btn];
    }

    [self addSubview:messageView];

    return self;
}

- (void)showInWindow {
  [[[[UIApplication sharedApplication] windows] firstObject] addSubview:self];

  [[[[UIApplication sharedApplication] windows] firstObject]
      bringSubviewToFront:self];

  messageView.transform = CGAffineTransformMakeScale(0.9, 0.9);

  [UIView animateWithDuration:0.2
      delay:0
      options:UIViewAnimationOptionCurveEaseOut
      animations:^{
        messageView.transform = CGAffineTransformIdentity;

      }
      completion:^(BOOL finished) {
        indicatorView.alpha = 1.0;
      }];

  [self layoutIfNeeded];
}

- (void)dismiss {

  if ([indicatorView superview]) {
    [indicatorView removeFromSuperview];

    indicatorView = nil;
  }

  [UIView animateWithDuration:0.2
      animations:^{
        //        parentView.alpha = 0.0;
        messageView.alpha = 0.0;
        indicatorView.alpha = 0.0;

      }
      completion:^(BOOL finished) {

        [messageView removeFromSuperview];

        messageView = nil;

        [self removeFromSuperview];
      }];
}

- (void)buttonClicked:(UIButton *)btn {

  if ([self.delegate
          respondsToSelector:@selector(QAlertView:clickedAtButtonIndex:)]) {

    [self.delegate QAlertView:self clickedAtButtonIndex:btn.tag];
  }

  [self dismiss];
}

提前致谢。

2个回答

2

在你的方法- (CGRect)getBounds中,方法UIInterfaceOrientationIsPortraitUIInterfaceOrientationIsLandscape仅适用于iOS8及更高版本。

可用性

iOS 8.3及更高版本可用。

请手动检查这些情况。

enum UIInterfaceOrientation : Int {
    case Unknown
    case Portrait
    case PortraitUpsideDown
    case LandscapeLeft
    case LandscapeRight
}

谢谢。如果您能为iOS 7提供一些建议,那就太好了。 - Sakthi
嗨,你可以像@du30的帖子中那样检查interfaceOrientation == UIInterfaceOrientationPortrait。 - Ted
别忘了在你喜欢的答案下面点赞哦 :) - Ted
嗨,Ted,目前我只能获取到PortraitUpsideDown的情况,但无法获取横向左右的情况。该怎么做? - Sakthi

1
- (CGRect)getBounds {

  [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
  CGRect screenBounds = [UIScreen mainScreen].bounds;

  NSString *ver = [[UIDevice currentDevice] systemVersion];

  float ver_float = [ver floatValue];

  if (ver_float >= 8.0) {
    return screenBounds;
  }

  CGFloat width = CGRectGetWidth(screenBounds);

  CGFloat height = CGRectGetHeight(screenBounds);

  UIInterfaceOrientation interfaceOrientation =
      [UIApplication sharedApplication].statusBarOrientation;

  if (interfaceOrientation == UIInterfaceOrientationPortrait) {
    screenBounds.size = CGSizeMake(width, height);
  } else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
    screenBounds.size = CGSizeMake(height, width);
  }
  return screenBounds;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接