iOS_21团购_Popover适应iPad横竖屏切换

终于效果图:

代码片段:

//
//  DockItemLocation.m
//  帅哥_团购
//
//  Created by beyond on 14-8-13.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "DockItemLocation.h"
// 点击dock上面的locationBtn,弹出的Popover封装的控制器,其上方是搜索栏,下方是tableView
#import "CityLocationController.h"

// button上面是图片,以下是文字,这是图片在高度上的比例
#define kImageHeightRatioInBtn 0.5

@interface DockItemLocation()<UIPopoverControllerDelegate>
{
    //popover控制器,创建出来之后,show方法显示,因此不能够是局部变量,必须用成员变量记住,否则方法btnClick调用完成就销毁了,还怎样 显示捏?

UIPopoverController *_popoverCtrl;
}
@end
@implementation DockItemLocation

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // 1.调用父类的方法,设置内部的图片
        [self setIcon:@"ic_district.png" selectedIcon:@"ic_district_hl.png"];

        // 2.自己主动伸缩
        self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;

        // 3.设置默认的文字
        [self setTitle:@"定位中" forState:UIControlStateNormal];
        self.titleLabel.font = [UIFont systemFontOfSize:16];
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        [self setTitleColor:[UIColor whiteColor] forState:UIControlStateDisabled];
        [self setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];

        // 4.设置图片属性
        self.imageView.contentMode = UIViewContentModeCenter;

        // 5.监听点击【Location定位】,弹出一个Popover控制器
        [self addTarget:self action:@selector(locationBtnOnDockClicked) forControlEvents:UIControlEventTouchDown];
    }
    return self;
}
// 5.监听点击【Location定位】,弹出一个Popover控制器
- (void)locationBtnOnDockClicked
{
    // 禁用,仅仅可点击一次
    self.enabled = NO;
    // 点击dock上面的locationBtn,弹出的Popover封装的控制器,其上方是搜索栏,下方是tableView
    CityLocationController *cityVC = [[CityLocationController alloc] init];

    // 唯一一个不是继承自UIViewController的控制器,它继承自NSObject
    //popover控制器,创建出来之后,show方法显示,因此不能够是局部变量,必须用成员变量记住,否则方法btnClick调用完成就销毁了,还怎样 显示捏?
    _popoverCtrl = [[UIPopoverController alloc] initWithContentViewController:cityVC];
    // 设置这个Popover控制器的显示的大小
    _popoverCtrl.popoverContentSize = CGSizeMake(320, 480);
    // 代理,监听Popover控制器的XX事件
    _popoverCtrl.delegate = self;
    // 由于其它方法也要显示,_popoverCtrl,所以抽取成自己定义方法
    [self showPopoverCtrl];

    // 由于屏幕旋转时,弹出的popover的指向的位置就不正确了,所以有必要注冊监听屏幕旋转的通知
    // 先移除监听器,保证健壮性
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
    // 再加入一个监听器,一旦设备出现UIDeviceOrientationDidChangeNotification,就会调用observer的selector方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidRotated) name:UIDeviceOrientationDidChangeNotification object:nil];
}
// 5-1,由于侦听到屏幕旋转了,也要再次显示_popoverCtrl,所以抽取成自己定义方法
- (void)showPopoverCtrl
{
    // 显示到哪里?

假设目标view是self自己,则rect使用bounds,由于bounds的原点才是相对于自己
    // 假设目标view是self.superView,则rect使用frame,由于frame的原点才是相对于父控件
    [_popoverCtrl presentPopoverFromRect:self.bounds inView:self permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
// 5-2,再加入一个监听器,一旦设备出现UIDeviceOrientationDidChangeNotification,就会调用observer的selector方法
- (void)screenDidRotated
{
    if (_popoverCtrl.popoverVisible) {
        // 1.    关闭之前位置上面的_popoverCtrl
        [_popoverCtrl dismissPopoverAnimated:NO];

        // 2.    0.5秒后创建新的位置上的_popoverCtrl
        [self performSelector:@selector(showPopoverCtrl) withObject:nil afterDelay:0.5];
    }
}
#pragma mark - popOver代理方法
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    // 消失前,让定位button恢复能够点击状态
    self.enabled = YES;

    // 消失前,即popover被销毁的时候。移除注冊的监听器(通知)
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}

#pragma mark - 销毁时,移除当前对控制器对屏幕的监听,防止野指针
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

#pragma mark - 覆写调整图片和文字在button中的Frame
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    CGFloat btnW = contentRect.size.width;
    CGFloat imgH = contentRect.size.height * kImageHeightRatioInBtn;
    return CGRectMake(0, 0, btnW, imgH);
}

- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    CGFloat btnW = contentRect.size.width;
    CGFloat textH = contentRect.size.height * (1 - kImageHeightRatioInBtn);
    // 文字在以下,图片在上面
    CGFloat textY = contentRect.size.height - textH;
    return CGRectMake(0, textY, btnW, textH);
}

@end
时间: 2024-11-04 13:43:35

iOS_21团购_Popover适应iPad横竖屏切换的相关文章

iPad纯代码实现横竖屏切换,采用相对布局

因为本来不喜欢使用StoryBoard.xib等可视化编程,一直使用的纯代码布局,但是纯代码布局的iOS开发者会遇到一个问题,就是横竖屏适配的问题,如果使用自动布局,那些约束的,写起来都是不难,但是控件之间的关联太多,以至于维护性很差.本人由于工作的原因,做iPad开发,那就必须要解决横竖屏适配的问题,于是就有了这篇文章. 代码如下: // //  ViewController.swift //  iPad横竖屏切换 // //  Created by zhangxu on 16/7/30. /

iOS_21团购_通过block对请求工具类的代理方法进行二次封装

最终效果图: [点评]提供的工具类DPAPI 在请求完毕后,使用的是代理机制,当一次请求成功或者失败时,会调用代理的相应方法 为了将点评提供的工具类DPAPI进行二次封装, 再次定义了一个block: typedef  void(^RequestDoneCallBackBlock)(id deals,NSError *err); 该block有两个参数, 分别是成功时,服务器返回的deals字典数组 另一个参数是:请求失败时,服务器返回的失败信息 两个参数分别对应代理的两个方法(即成功.失败时分

iOS_21团购_拼音搜索

最终效果图: 关键代码: 搜索结果控制器: // // SearchResultController.m // 帅哥_团购 // // Created by beyond on 14-8-15. // Copyright (c) 2014年 com.beyond. All rights reserved. // 当搜索框searchBar里面的文字change的时候,会创建本控制器,展示搜索结果列表,本控制器只有唯一一个成员变量,那就是从CityLocationController控制器的sea

iOS_21团购_UICollectionView的基本使用

最终效果图: 代码片段: DealListController继承自UICollectionViewController self.view已经包含了一个UICollectionView 并且数据源和代理已经是当前控制器self // // DealListController.m // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 点击do

iOS_21团购_iPad中子控制器的屏幕适配

最终效果图: iPad中重要的屏幕适配技巧, 先添加一个contentView占位, 并且只在viewDidLoad方法中设置frame, 因为iPad中无论横屏还是竖屏,W都是窄的那一条边, 因此,先添加一个contentView到主控制器的右侧, 并让它随着主控制器宽高自动伸缩, 而子控制器的view只需添加到contentView中即可,x 0 y 0宽高就是contentView的bounds 代码片段: // // MainViewController.m // 帅哥_团购 // //

iOS_21团购_【运行时】将字典转成对象模型

最终效果图: 核心代码: NSObject+Dict.h // // NSObject+Dict.h // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 使用运行时,将dict转成对象 #import <Foundation/Foundation.h> @interface NSObject (Dict) // 一个对象,调用此方法,参数

iOS_21团购_发送请求获取【点评】数据

请求结果简单显示: 用到的点评封装的类: 使用tableView简单展示: // // DealListController.m // 帅哥_团购 // // Created by beyond on 14-8-14. // Copyright (c) 2014年 com.beyond. All rights reserved. // 点击dock上面的[团购]按钮对应的控制器,上面是导航栏,导航栏右边是searchBar,导航栏左边是一个大按钮(TopMenu)(内部由三个小按钮组成<TopM

纯代码适配iPad横竖屏

网上大量的文章在适配iPad横竖屏时都使用了xib或storyboad, 但是xib和storyboard并不受团队开发欢迎,下面介绍采用纯代码的方式适配iPad的横屏和竖屏,方法非常简单: 1.) 设置要适配的对象的autoresizingMask,  eg: targetView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 2.)   在当前的视图控制器中调用[self willRotateToInterfaceOrientati

禁止横竖屏切换、强制横竖屏:

js判断屏幕横竖屏:function orient() {        //alert('gete');        if (window.orientation == 0 || window.orientation == 180) {            $("body").attr("class", "portrait");            orientation = 'portrait';            return f