swift4.2如何实现新闻首页导航-创新互联
这篇文章主要为大家展示了swift4.2如何实现新闻首页导航,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。
成都创新互联成立于2013年,是专业互联网技术服务公司,拥有项目网站制作、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元孝义做网站,已为上家服务,为孝义各地企业和个人服务,联系电话:028-86922220对于仿照新闻首页的页面,已经有比较好用的OC版本,现在我们来写一个swift版本的。
设备:xcode 10.2 语言:swift 4.2
效果图:

我们先创建一个多控制器的导航栏,直接上代码:
//
// JHSBarItemView.swift
// ScrollBarController
//
// Created by yaojinhai on 2019/4/15.
// Copyright © 2019年 yaojinhai. All rights reserved.
//
import UIKit
enum BarItemBorderType {
case defualt
case barItem
case maskView
case customItem
}
protocol JHSBarItemViewDelegate: NSObjectProtocol {
func selectedIndexItem(view: JHSBarItemView,index: Int) -> Void
}
class JHSBarItemView: UIView {
var minMargin: CGFloat = BarConfig.minMargin;
weak var delegate: JHSBarItemViewDelegate?
var lineBarView: UIView!
var barType = BarItemBorderType.defualt {
didSet{
configBarType();
removeBarItem(idx: selectedIndex);
}
}
var selectedIndex = 0;
var titles: [String]!{
didSet{
caculateItemSize();
}
}
private var titlesView: UICollectionView!
private var cachesSize = [String:CGSize]();
override init(frame: CGRect) {
super.init(frame: frame);
createContentView();
}
convenience init(frame: CGRect,titles: [String]) {
self.init(frame: frame);
self.titles = titles;
createContentView();
caculateItemSize();
}
func progressWidth() -> Void {
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension JHSBarItemView: UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
private func caculateItemSize() -> Void {
guard let itemTitles = titles ,itemTitles.count > 0 else {
return;
}
var maxWidth: CGFloat = 0;
for item in itemTitles {
let size = item.textSize(size: CGSize(width: width, height: height), font: BarConfig.normalFont);
cachesSize[item] = CGSize(width: size.width, height: height);
maxWidth += size.width;
}
let gap = (width - maxWidth) / CGFloat(itemTitles.count + 1);
minMargin = max(gap, BarConfig.minMargin);
titlesView.reloadData();
removeBarItem(idx: selectedIndex);
}
private func createContentView() -> Void {
if titlesView != nil {
return;
}
let layout = UICollectionViewFlowLayout();
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.scrollDirection = .horizontal;
titlesView = FMBaseCollectionView(frame: .init(x: 0, y: 0, width: width, height: height), collectionViewLayout: layout);
addSubview(titlesView);
titlesView.register(BarItemViewCell.self, forCellWithReuseIdentifier: "title");
titlesView.delegate = self;
titlesView.dataSource = self;
let lineView = createView(rect: .init(x: 0, y: height - 1, width: width, height: 1));
lineView.backgroundColor = rgbColor(rgb: 234);
}
// MARK: - collection view delegate and dataSource
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return titles?.count ?? 0;
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: minMargin, bottom: 0, right: minMargin);
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if titles == nil {
return CGSize.zero;
}
let item = titles[indexPath.row];
if let size = cachesSize[item] {
return CGSize(width: size.width + minMargin, height: height);
}
let size = titles[indexPath.row].textSize(size: CGSize.init(width: width, height: height), font: BarConfig.normalFont);
let newSize = CGSize(width: size.width + minMargin, height: height);
cachesSize[item] = size;
return newSize;
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "title", for: indexPath) as! BarItemViewCell;
cell.titleLabel.text = titles[indexPath.row];
cell.titleLabel.isHighlighted = selectedIndex == indexPath.row;
return cell;
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
didSelected(idx: indexPath.row);
delegate?.selectedIndexItem(view: self, index: indexPath.row);
}
func didSelected(idx: Int) -> Void {
let indexPath = IndexPath(item: idx, section: 0);
titlesView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true);
let cell = titlesView.cellForItem(at: indexPath) as? BarItemViewCell;
cell?.titleLabel.isHighlighted = true;
cell?.RunAnimation();
removeBarItem(idx: indexPath.row);
if selectedIndex != indexPath.row {
let preCell = titlesView.cellForItem(at: .init(row: selectedIndex, section: 0)) as? BarItemViewCell;
preCell?.titleLabel.isHighlighted = false;
preCell?.RunAnimation();
selectedIndex = indexPath.row;
}
}
}
extension JHSBarItemView {
private func removeBarItem(idx: Int) {
if barType == .barItem {
let size = getMaxWidthAt(index: idx);
lineBarView.frame = .init(x: size.width, y: height - 2, width: size.height, height: 2);
}else if barType == .maskView {
let size = getMaxWidthAt(index: idx);
lineBarView.frame = .init(x: size.width - minMargin/2, y: 0, width: size.height + minMargin, height: height);
}
}
func getMaxWidthAt(index: Int) -> CGSize {
if titles == nil || titles.count == 0 {
return CGSize.zero;
}
var maxWidth: CGFloat = minMargin;
var sizeWidth: CGFloat = cachesSize[titles[0]]!.width;
if index > 0 {
for item in 1...index {
let title = titles[item];
let size = cachesSize[title]!;
maxWidth += size.width + minMargin;
sizeWidth = size.width;
}
}
return CGSize(width: maxWidth + minMargin/2, height: sizeWidth);
}
private func configBarType() -> Void {
if barType == .barItem {
if lineBarView == nil {
lineBarView = createView(rect: .init(x: 0, y: height - 2, width: 30, height: 2));
lineBarView.backgroundColor = UIColor.red;
lineBarView.layer.cornerRadius = 2;
lineBarView.layer.masksToBounds = true;
}
titlesView.addSubview(lineBarView);
}else if barType == .maskView {
if lineBarView == nil {
lineBarView = createView(rect: .init(x: 0, y: 0, width: 30, height: height));
lineBarView.backgroundColor = UIColor.green.withAlphaComponent(0.2);
lineBarView.isUserInteractionEnabled = false;
}
titlesView.addSubview(lineBarView);
}else{
titlesView?.removeFromSuperview();
}
}
}
class BarItemViewCell: UICollectionViewCell {
var titleLabel: UILabel!
override init(frame: CGRect) {
super.init(frame: frame);
titleLabel = createLabel(rect: bounds, text: "");
titleLabel.textAlignment = .center;
titleLabel.textColor = BarConfig.normalColor;
titleLabel.highlightedTextColor = BarConfig.hlightedColor;
titleLabel.font = BarConfig.normalFont;
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func RunAnimation(animation: Bool = true) -> Void {
self.titleLabel.font = self.titleLabel.isHighlighted ? BarConfig.hlightedFont : BarConfig.normalFont;
}
} 当前标题:swift4.2如何实现新闻首页导航-创新互联
文章起源:http://www.jxjierui.cn/article/cdedcd.html


咨询
建站咨询
