1. 이전 포스팅 확인하기
https://growingsaja.tistory.com/887
2. 예제 소스코드 작성하기
h 파일은 특별히 수정할 것이 없습니다.
// vim Controller/FirstViewController.h
#import <UIKit/UIKit.h>
// FirstViewController라는 이름의 뷰 컨트롤러 클래스를 선언합니다.
@interface FirstViewController : UIViewController
@end
// vim Controller/FirstViewController.m
#import <Foundation/Foundation.h>
#import "FirstViewController.h"
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 뷰의 배경색을 설정합니다.
self.view.backgroundColor = [UIColor whiteColor];
// 카드뷰에 표시할 데이터를 초기화합니다.
NSArray *cryptocurrencyNames = @[@"Bitcoin", @"Ethereum", @"Ripple", @"Litecoin", @"Bitcoin Cash"];
NSArray *cryptocurrencyPrices = @[@"$33,000", @"$2,500", @"$0.7", @"$120", @"$400"];
// 카드뷰 배치에 필요한 변수를 설정합니다.
CGFloat cardViewWidth = 320.0;
CGFloat cardViewHeight = 120.0;
CGFloat cardViewLeftMargin = 30.0;
CGFloat cardViewXPos = ([UIScreen mainScreen].bounds.size.width - cardViewWidth) / 2.0;
CGFloat cardViewSpacing = 10.0;
// 카드뷰들을 생성하고 뷰에 추가합니다.
for (int i = 0; i < cryptocurrencyNames.count; i++) {
UIView *cardView = [[UIView alloc] initWithFrame:CGRectMake(cardViewXPos, 50 + cardViewLeftMargin + i * (cardViewSpacing + cardViewHeight), cardViewWidth, cardViewHeight)];
// 카드뷰 모서리를 둥글게 설정합니다. 조건 1
cardView.layer.cornerRadius = 10.0;
cardView.layer.masksToBounds = YES;
// 카드뷰 배경색을 설정합니다.
cardView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:cardView];
// 암호화폐 이름 레이블을 생성하고 카드뷰에 추가합니다. 조건 2
UILabel *cryptoNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, cardViewWidth / 2 - 20, 20)];
cryptoNameLabel.text = cryptocurrencyNames[i];
[cardView addSubview:cryptoNameLabel];
// 암호화폐 가격 레이블을 생성하고 카드뷰에 추가합니다. 조건 3
UILabel *cryptoPriceLabel = [[UILabel alloc] initWithFrame:CGRectMake(cardViewWidth / 2, 10, cardViewWidth / 2 - 10, 20)];
cryptoPriceLabel.text = cryptocurrencyPrices[i];
cryptoPriceLabel.textAlignment = NSTextAlignmentRight;
[cardView addSubview:cryptoPriceLabel];
// 활성화 스위치를 생성하고 카드뷰에 추가합니다. 조건 4
UISwitch *activationSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(cardViewWidth / 4 * 3, cardViewHeight - 40, 200, 40)];
[activationSwitch addTarget:self action:@selector(onSwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
[cardView addSubview:activationSwitch];
// 거래소 이름 레이블을 생성하고 카드뷰에 추가합니다. 조건 5
UILabel *exchangeNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, cardViewHeight - 25, cardViewWidth - 20, 20)];
exchangeNameLabel.text = @"Binance";
exchangeNameLabel.font = [UIFont systemFontOfSize:12.0];
[cardView addSubview:exchangeNameLabel];
}
}
- (void)onSwitchValueChanged:(UISwitch *)sender {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Switch value changed: %@", sender.isOn ? @"ON" : @"OFF");
});
}
@end
3. 예제 코드 실행 결과
스위치를 누를때 문구가 출력되도록 "onSwitchValueChanged" 또한 구현했습니다. 불필요시 삭제해도 무방합니다.
4. 소스코드 개선한 버전으로 수정하기 (Dark mode 고려)
First -> CurrencyTrackerListVC
Second -> SpotGoodsTrackerListVC
Third -> MyProfileVC
이름 변경 및 다크모드를 고려한 개발 버전입니다.
5. 소스코드 수정
다크모드인 경우와 라이트모드인 경우에 대해 색이 다르게 보이도록 소스코드를 수정합니다.
색에 대한 설정을 할 경우, whiteColor 등을 고정으로 fix해두면 다크모드에서도 하얀색으로 노출되기에 조심해야합니다.
// vim Controller/CurrencyTrackerListVC.h
#import <UIKit/UIKit.h>
// SecondViewController라는 이름의 뷰 컨트롤러 클래스를 선언합니다.
@interface CurrencyTrackerListVC : UIViewController
@end
// vim Controller/CurrencyTrackerListVC.m
#import <Foundation/Foundation.h>
#import "CurrencyTrackerListVC.h"
@implementation CurrencyTrackerListVC
- (void)viewDidLoad {
[super viewDidLoad];
// 카드뷰에 표시할 데이터를 초기화합니다.
NSArray *cryptocurrencyNames = @[@"Bitcoin", @"Ethereum", @"Ripple", @"Litecoin", @"Bitcoin Cash"];
NSArray *cryptocurrencyPrices = @[@"$33,000", @"$2,500", @"$0.7", @"$120", @"$400"];
// 카드뷰 배치에 필요한 변수를 설정합니다.
CGFloat cardViewWidth = [UIScreen mainScreen].bounds.size.width - 4;
CGFloat cardViewHeight = 60.0;
CGFloat cardViewLeftMargin = 30.0;
CGFloat cardViewXPos = ([UIScreen mainScreen].bounds.size.width - cardViewWidth) / 2.0;
CGFloat cardViewSpacing = 10.0;
// 카드뷰들을 생성하고 뷰에 추가합니다.
for (int i = 0; i < cryptocurrencyNames.count; i++) {
UIView *cardView = [[UIView alloc] initWithFrame:CGRectMake(cardViewXPos, 50 + cardViewLeftMargin + i * (cardViewSpacing + cardViewHeight), cardViewWidth, cardViewHeight)];
// 카드뷰 모서리를 둥글게 설정합니다. 조건 1
cardView.layer.cornerRadius = 10.0;
cardView.layer.masksToBounds = YES;
// UILabel의 텍스트 색상 및 배경색 설정
// 카드뷰 배경색을 설정합니다.
if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
// 다크모드인 경우
cardView.backgroundColor = [UIColor darkGrayColor];
[self.view addSubview:cardView];
} else {
// 라이트모드인 경우
cardView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:cardView];
}
// 암호화폐 이름 레이블을 생성하고 카드뷰에 추가합니다. 조건 2
UILabel *cryptoNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, cardViewWidth / 2 - 20, 20)];
cryptoNameLabel.text = cryptocurrencyNames[i];
[cardView addSubview:cryptoNameLabel];
// 암호화폐 가격 레이블을 생성하고 카드뷰에 추가합니다. 조건 3
UILabel *cryptoPriceLabel = [[UILabel alloc] initWithFrame:CGRectMake(cardViewWidth / 3, 10, cardViewWidth / 2 - 10, 20)];
cryptoPriceLabel.text = cryptocurrencyPrices[i];
cryptoPriceLabel.textAlignment = NSTextAlignmentRight;
[cardView addSubview:cryptoPriceLabel];
// 활성화 스위치를 생성하고 카드뷰에 추가합니다. 조건 4
UISwitch *activationSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(cardViewWidth / 7 * 6, cardViewHeight - 40, 200, 40)];
[activationSwitch addTarget:self action:@selector(onSwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
[cardView addSubview:activationSwitch];
// 거래소 이름 레이블을 생성하고 카드뷰에 추가합니다. 조건 5
UILabel *exchangeNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, cardViewHeight - 25, cardViewWidth - 20, 20)];
exchangeNameLabel.text = @"Binance";
exchangeNameLabel.font = [UIFont systemFontOfSize:12.0];
[cardView addSubview:exchangeNameLabel];
}
}
- (void)onSwitchValueChanged:(UISwitch *)sender {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Switch value changed: %@", sender.isOn ? @"ON" : @"OFF");
});
}
@end
// vim MyTabBarController.h
#import <UIKit/UIKit.h>
// MyTabBarController라는 이름의 탭바 컨트롤러 클래스를 선언합니다.
@interface MyTabBarController : UITabBarController
@end
// vim MyTabBarController.m
#import <Foundation/Foundation.h>
#import "MyTabBarController.h"
#import "CurrencyTrackerListVC.h"
#import "SpotGoodsTrackerListVC.h"
#import "MyProfileVC.h"
@implementation MyTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
// FirstViewController를 생성하고 속성을 설정합니다.
CurrencyTrackerListVC *firstTabMainVC = [[CurrencyTrackerListVC alloc] init];
UINavigationController *naviVC1 = [[UINavigationController alloc] initWithRootViewController:firstTabMainVC];
naviVC1.tabBarItem.title = @"첫 번째";
naviVC1.tabBarItem.image = [UIImage systemImageNamed:@"camera"];
// SecondViewController를 생성하고 속성을 설정합니다.
SpotGoodsTrackerListVC *secondTabMainVC = [[SpotGoodsTrackerListVC alloc] init];
UINavigationController *naviVC2 = [[UINavigationController alloc] initWithRootViewController:secondTabMainVC];
naviVC2.tabBarItem.title = @"두 번째";
naviVC2.tabBarItem.image = [UIImage systemImageNamed:@"house"];
// ThirdViewController를 생성하고 속성을 설정합니다.
MyProfileVC *thirdTabMainVC = [[MyProfileVC alloc] init];
UINavigationController *naviVC3 = [[UINavigationController alloc] initWithRootViewController:thirdTabMainVC];
naviVC3.tabBarItem.title = @"세 번째";
naviVC3.tabBarItem.image = [UIImage systemImageNamed:@"trash.fill"];
// 생성된 뷰 컨트롤러를 탭바 컨트롤러에 배치합니다.
NSArray *viewControllers = @[naviVC1, naviVC2, naviVC3];
self.viewControllers = viewControllers;}
@end
6. 결과 예시
- 다크모드 기준
- 라이트 모드 기준
'Development > iOS' 카테고리의 다른 글
[Objective-C] 앱 만들기 입문 - 4 : json file 읽어서 저장된 데이터 사용하기 (0) | 2023.07.06 |
---|---|
[Objective-C] 앱 만들기 입문 - 3 : 상하(위아래) 스크롤 기능 넣기 (0) | 2023.07.05 |
[Objective-C] 앱 만들기 입문 - 1 : 하단 메뉴탭바 만들기 (0) | 2023.06.30 |
[Objective-C] 입문하기 - 15 : extern const 사용해 외부 공유 가능한 상수 정의 및 호출 (0) | 2023.06.30 |
[Objective-C] 입문하기 - 14 : 날짜 데이터 활용 및 타이머 구현 실습 (0) | 2023.06.27 |